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

Ali*_*can 3 haskell

我递归地使用这种类型:

data Expr = Add Expr Expr | Num Int

add (Add (Num a) (Num b)) = a + b 
Run Code Online (Sandbox Code Playgroud)

对于add Add ((Num 1) (Num 2))作品,但我如何为所有递归类型做,如:

add Add( (Add (Num 1) (Num 2)) (Num 3) ) ?
Run Code Online (Sandbox Code Playgroud)

val*_*man 7

由于您无法知道Expr类型的值有多深,因此您必须编写递归函数来对其进行求值,而不是尝试立即采用整个表达式.

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

eval :: Expr -> Int
eval (Add a b) = eval a + eval b
eval (Num a)   = a
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你的快速回答! (2认同)