我有一个功能类型的函数:
newtonRootSequence' :: Double -> Double -> [Double]
和功能定义:
newtonRootSequence' xn d = [(xn + (d * (1/xn))) div 2] ++ newtonRootSequence' ((xn + (d * (1/xn))) div 2) d
收到两个值xn和d后,它应计算给定函数的结果
[(xn + (d * (1/xn))) div 2]
但由于某些原因,在启动时,编译器不接受带错误的功能:
无法匹配预期类型'(整数 - >整数 - >整数 - >) - >整数 - > double实际类型double函数(xn +(d *(1 / xn)))div 2)应用于两个参数
我尝试将等式的结果发送到递归步骤
的部分会出现此错误++ newtonRootSequence' ((xn + (d * (1/xn))) div 2) d
答案 0 :(得分:0)
正如评论中已经提到的那样:
div
用作中缀函数,则必须将其括在反引号中div
用于积分除法,截断为负无穷大,而不是用于除Double
这两点是导致错误消息的原因。
要划分Doubles
,请使用/
运算符,就像您在表达式1/xn
中所做的那样。
这样你的代码应该可行。为清楚起见,它可以改变:
提取重复的表达式,将序列中的下一个xn
计算为where
子句。表达式也可以略微简化。在列表前添加单个元素可以使用cons运算符(:)
:
newtonRootSequence' xn d = xn' : newtonRootSequence' xn' d
where xn' = (xn + (d / xn)) / 2
您可以使用Prelude中的iterate :: (a -> a) -> a -> [a]
将单个步骤的计算与生成中间步骤列表分开(注意翻转的参数):
sequenceStep :: Double -> Double -> Double
sequenceStep s xn = (xn + (s / xn)) / 2
newtonRootSequence' :: Double -> Double -> [Double]
newtonRootSequence' s x0 = iterate (sequenceStep s) x0