首页 文章

功能类型不匹配

提问于
浏览
1

我有一个函数类型的函数:

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 回答

  • 0

    正如评论中已经提到的:

    • 如果你想使用 div 作为中缀函数,你必须将它包含在反引号中

    • div 用于积分除法,截断为负无穷大,不是为了划分 Double

    这两点是导致错误消息的原因 .

    要划分 Doubles ,请使用 / 运算符,就像在表达式 1/xn 中一样 .

    有了这个你的代码应该工作 . 为清楚起见,它可以改变:

    • 提取重复的表达式以计算序列中的下一个 xnwhere 子句 . 表达式也可以略微简化 . 在列表前添加单个元素可以使用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
    

相关问题