Haskell:如何将函数模式与递归类型相匹配?

时间:2013-05-26 16:42:10

标签: haskell

我递归地使用这种类型:

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) ) ?

1 个答案:

答案 0 :(得分:7)

由于您无法知道Expr类型的值有多深,因此您必须编写一个递归函数来评估它,而不是尝试立即采用整个表达式。

对于您的Expr类型,它看起来像这样:

eval :: Expr -> Int
eval (Add a b) = eval a + eval b
eval (Num a)   = a

一般来说,当你有这样的递归类型时,你需要一个递归函数来做任何真正有趣的事情。