我递归地使用这种类型:
data Expr = Add Expr Expr | Num Int
add (Add (Num a) (Num b)) = a + b
对于add Add ((Num 1) (Num 2))
有效,但我如何处理所有递归类型,例如:
add Add( (Add (Num 1) (Num 2)) (Num 3) ) ?
答案 0 :(得分:7)
由于您无法知道Expr类型的值有多深,因此您必须编写一个递归函数来评估它,而不是尝试立即采用整个表达式。
对于您的Expr类型,它看起来像这样:
eval :: Expr -> Int
eval (Add a b) = eval a + eval b
eval (Num a) = a
一般来说,当你有这样的递归类型时,你需要一个递归函数来做任何真正有趣的事情。