所以,我已经定义了lambda数据类型:
data LExpr
= Variable String -- variable
| Apply LExpr LExpr -- function application
| Lambda String LExpr -- Lambda abstraction
deriving (Eq, Show)
现在我想自己实现Show
的实例。我已经完成了大部分工作的函数show'
,但没有使用实例:
show' :: LExpr -> String
show' (Variable a) = a
show' (Apply e1 e2) = "(" ++ show' e1 ++ " " ++ show' e2 ++ ")"
show' (Lambda x e) = "(λ " ++ x ++ ". " ++ show' e ++ ")"
如何实现它,以获得以下输出而不使用show'
函数:
Main> (Apply (Lambda "x" (Apply (Variable "x") (Variable "y"))) (Variable "z"))
((λ x. x y) y)
答案 0 :(得分:5)
为Show
类添加实例声明。
instance Show LExpr where
show = show'
删除deriving(Show)
部分
data LExpr
= Variable String -- variable
| Apply LExpr LExpr -- function application
| Lambda String LExpr -- Lambda abstraction
deriving (Eq)