recursion-schemes package might do the trick. I wrote TH for it and
somebody took care of getting it merged in. It should simplify some of
this boilerplate.
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
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafeOnly members subscribed via the mailman list are allowed to post.