
On Feb 13, 2008 5:36 AM, Luke Palmer
On Feb 13, 2008 9:33 AM,
wrote: The approach is based on the final tagless representation. Here is our DSL:
class Exp repr where constant :: Int -> repr Int variable :: String -> repr Int add :: repr Int -> repr Int -> repr Int sub :: repr Int -> repr Int -> repr Int
This is very nice. May I ask, though, what is the purpose of all the Ints appearing as arguments to repr here? Looking over this code, it seems that it would work just as well if they were all omitted.
In this example, they could be omitted. But let's say you had a
language more than one type:
class Exp repr where
constant :: Int -> repr Int
variable :: String -> repr Int
add :: repr Int -> repr Int -> repr Int
sub :: repr Int -> repr Int -> repr Int
true :: repr Bool
false :: repr Bool
and :: repr Bool -> repr Bool -> repr Bool
less_than :: repr Int -> repr Int -> repr Bool
if_ :: repr Bool -> repr a -> repr a -> repr a
The argument to repr prevents you from writing ill-typed code like
"if_ (variable "x") (constant 0) false".
--
Dave Menendez