我递归地使用这种类型:
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)
由于您无法知道Expr类型的值有多深,因此您必须编写递归函数来对其进行求值,而不是尝试立即采用整个表达式.
对于您的Expr类型,它看起来像这样:
eval :: Expr -> Int
eval (Add a b) = eval a + eval b
eval (Num a) = a
Run Code Online (Sandbox Code Playgroud)
通常,当你有这样的递归类型时,你将需要一个递归函数来做任何真正有趣的事情.