3

我递归地有这种类型:

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

1 回答 1

7

由于您无法知道 Expr 类型的值嵌套的深度,因此您必须编写一个递归函数来评估它,而不是尝试一次处理整个表达式。

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

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

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

于 2013-05-26T16:47:58.050 回答