Remove redundancy with Template Haskell
Hi Café, I have a function that looks like this: call :: SomeFunction -> String -> SomeState The string is actually the representation of the function passed in parameter. It is stored in the state for documentation. So a call looks like that: call (\a -> putStrLn a) "\a -> putStrLn a" There is a clear redundancy here, how could I remove it with Template Haskell? I cannot figure out... Thanks! Corentin
Hi Corentin, On Wed, Mar 27, 2013 at 09:13:41PM +0100, Corentin Dupont wrote:
I have a function that looks like this: call :: SomeFunction -> String -> SomeState
The string is actually the representation of the function passed in parameter. It is stored in the state for documentation. So a call looks like that: call (\a -> putStrLn a) "\a -> putStrLn a"
There is a clear redundancy here, how could I remove it with Template Haskell? I cannot figure out...
You can even use cpp to get something like: #define CALL(func) call (func) #func CALL(\a -> a + 1) => call (\a -> a + 1) "\a -> a + 1" Greetings, Daniel
Thanks Daniel, that's very simple! Realizing this in TH seems be impossible, is it right? On Wed, Mar 27, 2013 at 10:33 PM, Daniel Trstenjak < daniel.trstenjak@gmail.com> wrote:
Hi Corentin,
On Wed, Mar 27, 2013 at 09:13:41PM +0100, Corentin Dupont wrote:
I have a function that looks like this: call :: SomeFunction -> String -> SomeState
The string is actually the representation of the function passed in parameter. It is stored in the state for documentation. So a call looks like that: call (\a -> putStrLn a) "\a -> putStrLn a"
There is a clear redundancy here, how could I remove it with Template Haskell? I cannot figure out...
You can even use cpp to get something like:
#define CALL(func) call (func) #func
CALL(\a -> a + 1) => call (\a -> a + 1) "\a -> a + 1"
Greetings, Daniel
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
argh, always forget to reply to all It's possible, just somewhat painful because TH /requires/ you to build an AST -- you can't just return a string representing what you want to splice in. Here's one using haskell-src-meta: {-# LANGUAGE TemplateHaskell #-} import Language.Haskell.TH import Language.Haskell.Meta call :: Name -> String -> Q Exp call name exp' = case parseExp exp' of Right expr -> let fun = [| name |] str = stringE exp' in [| $fun $(return expr) $str |] _ -> error "Invalid expression." This can be then used to make a QuasiQuoter: call' :: QuasiQuoter call' = QuasiQuoter { quoteExp = call 'functionYouWantHere } On Fri, Mar 29, 2013 at 8:40 AM, Corentin Dupont <corentin.dupont@gmail.com> wrote:
Thanks Daniel, that's very simple!
Realizing this in TH seems be impossible, is it right?
On Wed, Mar 27, 2013 at 10:33 PM, Daniel Trstenjak <daniel.trstenjak@gmail.com> wrote:
Hi Corentin,
On Wed, Mar 27, 2013 at 09:13:41PM +0100, Corentin Dupont wrote:
I have a function that looks like this: call :: SomeFunction -> String -> SomeState
The string is actually the representation of the function passed in parameter. It is stored in the state for documentation. So a call looks like that: call (\a -> putStrLn a) "\a -> putStrLn a"
There is a clear redundancy here, how could I remove it with Template Haskell? I cannot figure out...
You can even use cpp to get something like:
#define CALL(func) call (func) #func
CALL(\a -> a + 1) => call (\a -> a + 1) "\a -> a + 1"
Greetings, Daniel
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (3)
-
Corentin Dupont -
Daniel Trstenjak -
Mike Ledger