[Haskell-cafe] Replace data constructors via meta programming

Emil Axelsson 78emil at gmail.com
Mon Feb 12 15:57:21 UTC 2018


One option, inspired by the Syntactic package, is to factor out 
application from Proposition. I pasted an example here: 
http://lpaste.net/362410

`evalSym` is quite close to your `magic` function:

   evalSym :: Map Name Bool -> Sym a -> a
   evalSym ctx (Var v) = ctx ! v
   evalSym _ Not = not
   evalSym _ And = (&&)

/ Emil

Den 2018-02-12 kl. 02:30, skrev Vilem-Benjamin Liepelt:
> Hi,
> 
> I am looking for a solution to get rid of this silly boilerplate:
> 
> eval :: Ord var => Map var Bool -> Proposition var -> Bool
> eval ctx prop = evalP $ fmap (ctx Map.!) prop
>    where
>      evalP = \case
>          Var b -> b
>          Not q -> not $ evalP q
>          And p q -> evalP p && evalP q
>          Or p q -> evalP p || evalP q
>          If p q -> evalP p ==> evalP q
>          Iff p q -> evalP p == evalP q
> 
> What I would like to do in essence is to replace the data constructors like so:
> 
> -- Not valid Haskell!! Can't pattern match on constructor only...
> magic = \case
>      Var -> id
>      Not -> not
>      And -> (&&)
>      Or -> (||)
>      If -> (==>)
>      Iff -> (==)
> 
> compile = transformAST magic $ fmap (\case 'P' -> False; 'Q' -> True)
> 
>>>> compile (Iff (Not (And (Var 'P') (Var 'Q'))) (Or (Not (Var 'P')) (Not (Var 'Q'))))
>              ((==) (not ((&&) (id True) (id False))) ((||) (not (id True)) (not (id False))))
> 
> Note how the compiled expression exactly mirrors the AST, so there should be some meta programming technique for this.
> 
> Does anyone have an idea how I can achieve this?
> 
> The full source code is here: https://gist.github.com/vimuel/7dcb8a9f1d2b7b72f020d66ec4157d7b
> 
> I am happy to take any other comments relating to my code...
> 
> Best,
> 
> Vilem
> 
> 
> 
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
> 


More information about the Haskell-Cafe mailing list