我有这个递归类型:
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) ) ?
我有这个递归类型:
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) ) ?
由于您无法知道Expr类型的值嵌套有多深,因此您必须编写递归函数对其进行评估,而不是尝试一次性处理整个表达式。
对于您的Expr类型,它可能如下所示:
eval :: Expr -> Int
eval (Add a b) = eval a + eval b
eval (Num a) = a
通常情况下,当您有这样的递归类型时,您需要使用递归函数才能对其进行任何真正有趣的操作。
add (Int 5)
? - n. m.