Peter Verswyvelen wrote:
In Scheme, on can "quote" code, so that it becomes data. Microsoft's F#
and C# 3.0 also have something similar that turns code into "expression
trees".
I can't find something similar for Haskell? Maybe I am looking at the
wrong places?
Quoting/Inspecting code at runtime is not possible in Haskell since this
would break referential transparency, i.e. one could tell that two
extensionally equal values like
3 `add` 4
1 `add` (2 `mul` 3)
are different by inspecting their internal structure.
Of course, you can use constructors for add and mul and then inspect
and transform the result
data Expr = Val Int | Add Expr Expr | Mul Expr Expr
add, mul :: Expr -> Expr -> Expr
add = Add
mul = Mul
x :: Expr
x = Val 1 `add` (Val 2 `mul` Val 3)
By making Expr an instance of the class Num , you can use overloaded
arithmetic operations
instance Num Expr where
(+) = Add
(*) = Mul
fromInteger = Val . fromInteger
x :: Expr
x = 1 + 2*3
I want to write something like
selectiveQuote [add] (1 `add` 2 `mul` 3)
which would result in an expression tree like
add
/ \
1 6
So the `mul` is not quoted because it is not part of the "context" = [add]
I'm not sure why you'd want to do that, but it's not well-defined. What
would
selectiveQuote [add] ((1 `add` 2) `mul` 3)
be? How to expand `mul` here when `add` isn't expanded?
Regards,
apfelmus
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe