我有一个函数类型的函数:
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]
但由于某些原因,在启动时,编译器不接受带有错误的函数:
无法匹配期望类型'(整数 - >整数 - >整数 - >) - >整数 - >双实数类型双重函数(xn(d *(1 / xn)))div 2)应用于两个参数
我试图将方程的结果发送到递归步骤的部分发生此错误
++ newtonRootSequence' ((xn + (d * (1/xn))) div 2) d
1 回答
正如评论中已经提到的:
如果你想使用
div
作为中缀函数,你必须将它包含在反引号中div
用于积分除法,截断为负无穷大,不是为了划分Double
这两点是导致错误消息的原因 .
要划分
Doubles
,请使用/
运算符,就像在表达式1/xn
中一样 .有了这个你的代码应该工作 . 为清楚起见,它可以改变:
xn
到where
子句 . 表达式也可以略微简化 . 在列表前添加单个元素可以使用cons运算符(:)
完成:iterate :: (a -> a) -> a -> [a]
将单个步骤的计算与生成中间步骤列表分开(请注意翻转的参数):