I'm playing with tagless final interpreters reading [1], using a very simple
language:
>>> class Ints repr where
>>> int :: Integer -> repr Integer
>>> (.+.) :: repr Integer -> repr Integer -> repr Integer
>>> (.*.) :: repr Integer -> repr Integer -> repr Integer
>>> (.-.) :: repr Integer -> repr Integer
>>> (.<=.) :: repr Integer -> repr Integer -> repr Bool
>>> newtype P repr t = P { unP :: Bool -> repr t }
>>> instance Ints repr => Ints (P repr) where
>>> int n = P $ \ s -> if s then int n else (.-.) (int n)
>>> (.-.) n = P $ unP n . not
>>> n .+. m = P $ \ s -> unP n s .+. unP m s
>>> n .*. m = P $ \ s -> unP n s .*. unP m s
>>> n .<=. m = P $ \ s -> unP n s .<=. unP m s
After pushing down negations I'd like to distribute (.*.) over (.+.). [1]
leaves it as an exercise, so it can't be that hard, but I don't get it...
Anyone knows how I could do it?
[1]: <http://okmij.org/ftp/tagless-final/course/lecture.pdf>
thanks,
--
matteo
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe