Haskell: 如何在递归类型中匹配函数模式?

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

你如何评估 add (Int 5) - n. m.
1个回答

7

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

对于您的Expr类型,它可能如下所示:

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

通常情况下,当您有这样的递归类型时,您需要使用递归函数才能对其进行任何真正有趣的操作。


2
感谢您的及时回答! - Alin Ciocan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接