Create a gist now

Instantly share code, notes, and snippets.

Haskell AST basic example
data Exp r = Const r | Add (Exp r) (Exp r) | Subtract (Exp r) (Exp r)
eval :: (Num r) => Exp r -> r
eval (Const v) = v
eval (Add e1 e2) = (eval e1) + (eval e2)
eval (Subtract e1 e2) = (eval e1) - (eval e2)
reify :: (Show r) => Exp r -> String
reify (Const v) = show v
reify (Add e1 e2) = concat ["(",reify e1,"+",reify e2,")"]
reify (Subtract e1 e2) = concat ["(",reify e1,"-",reify e2,")"]
main :: IO ()
main = do
putStrLn $ reify exp1
putStrLn $ reify exp2
exp1 = Subtract (Add (Const 3) (Const 2)) (Const 1)
exp2 = Subtract (Add (Const (3::Double)) (Const 2)) (Const 1)
{-
Result on GHCi:
*Main> main
((3+2)-1)
((3.0+2.0)-1.0)
*Main> :t exp1
exp1 :: Exp Integer
*Main> :t exp2
exp2 :: Exp Double
*Main> :t (Const 1)
(Const 1) :: Num r => Exp r
*Main> :t (Const "hello")
(Const "hello") :: Exp [Char]
*Main> eval (Const "hello")
<interactive>:108:1:
No instance for (Num [Char]) arising from a use of `eval'
Possible fix: add an instance declaration for (Num [Char])
In the expression: eval (Const "hello")
In an equation for `it': it = eval (Const "hello")
-}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment