
Thanks Oleg! Brad: On 24/09/2009, at 3:54 PM, oleg@okmij.org wrote:
and interpret it several times, as an integer
-- testpw :: Int testpw = (unR power) (unR 2) ((unR 7)::Int) -- 128
My type function allows one to remove the '::Int' annotation, which is especially useful in situations where you cannot give an annotation due to 'show . read'-style ambiguity. Conversely one gives up some useful polymorphism (in my case, sometimes it would be nice to have multiple boolean types). Another nit with Oleg's code is that you can only interpret Bool with Bool, in the interpreter:
class QBool repr where true, false :: repr Bool if_ :: repr Bool -> repr w -> repr w -> repr w
If 'repr' is merely a Haskell98-style type constructor, it cannot analyse its argument. Hence there are two choices: use the argument (Bool) or don't (see the pretty printer). I doubt you could implement a very pleasant interpreter using the latter option, but see http://web.cecs.pdx.edu/~brianh/talks/talk20081010.pdf if you want to try. Again, using a type function here allows you to choose an arbitrary type to represent Bool (and so forth). Trying to do this with fundeps is possible but syntactically heavy. cheers peter