【发布时间】:2018-09-10 10:33:46
【问题描述】:
我正在定义一个自定义数据类型来帮助我进行项目的微积分。我已将这种数据类型定义如下:
data Math a =
Add (Math a) (Math a)
| Mult (Math a) (Math a)
| Cos (Math a)
| Sin (Math a)
| Log (Math a)
| Exp (Math a)
| Const a
| Var Char
deriving Show
我正在创建一个名为eval 的函数,它为我计算部分数学表达式。这就是我所拥有的:
eval (Const a) = (Const a)
eval (Var a) = (Var a)
eval (Add (Const a) (Const b)) = eval (Const (a+b))
eval (Add (Var a) b) = eval (Add (Var a) (eval b))
eval (Add a (Var b)) = eval (Add (eval a) (Var b))
eval (Add a b) = eval (Add (eval a) (eval b))
eval (Mult (Const a) (Const b)) = (Const (a*b))
eval (Mult a (Var b)) = (Mult (eval a) (Var b))
eval (Mult (Var a) b) = (Mult (Var a) (eval b))
eval (Mult a b) = eval (Mult (eval a) (eval b))
eval (Cos (Const a)) = (Const (cos(a)))
eval (Cos (Var a)) = (Cos (Var a))
eval (Cos a) = eval (Cos (eval a))
eval (Sin (Const a)) = (Const (sin(a)))
eval (Sin (Var a)) = (Sin (Var a))
eval (Sin a) = eval (Sin (eval a))
eval (Log (Const a)) = (Const (log(a)))
eval (Log (Var a)) = (Log (Var a))
eval (Log a) = eval (Log (eval a))
eval (Exp (Const a)) = (Const (exp(a)))
eval (Exp (Var a)) = (Exp (Var a))
这在大多数情况下都可以正常工作。例如,eval (Mult ((Const 4)) (Add (Cos (Const (0))) (Log (Const 1)))) 的结果是 (Const 4.0)
每当我添加一个带有两个常量的变量时,我的问题就会出现:
eval (Add (Const 4) (Add (Const 4) (Var 'x'))) 给了我无限递归。我已经确定问题是因为我在eval (Add a b) = eval (Add (eval a) (eval b)) 上调用eval。如果我创建这条线 eval (Add a b) = (Add (eval a) (eval b)),我将停止无限递归,但我不再简化我的答案:Add (Const 4.0) (Add (Const 4.0) (Var 'x')) 得到完全相同的 Add (Const 4.0) (Add (Const 4.0) (Var 'x'))。我怎样才能得到类似Add (Const 8.0) (Var 'x') 的东西?
任何帮助将不胜感激!
【问题讨论】:
标签: haskell recursion types functional-programming pattern-matching