lambda抽象ADT的显示实例

时间:2015-06-21 14:27:00

标签: haskell instance show typeclass

所以,我已经定义了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)       

1 个答案:

答案 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)