Thanks Oleg!
Brad:
On 24/09/2009, at 3:54 PM, o...@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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe