功能类型不匹配

时间:2017-11-14 16:37:39

标签: haskell recursion type-mismatch

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

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

1 个答案:

答案 0 :(得分:0)

正如评论中已经提到的那样:

  • 如果您想将div用作中缀函数,则必须将其括在反引号中
  • div用于积分除法,截断为负无穷大,而不是用于除Double

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

要划分Doubles,请使用/运算符,就像您在表达式1/xn中所做的那样。

这样你的代码应该可行。为清楚起见,它可以改变:

  1. 提取重复的表达式,将序列中的下一个xn计算为where子句。表达式也可以略微简化。在列表前添加单个元素可以使用cons运算符(:)

    完成
    newtonRootSequence' xn d = xn' : newtonRootSequence' xn' d
        where xn' = (xn + (d / xn)) / 2
    
  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