没有(Show(Double - > Double))的实例

时间:2017-11-10 18:57:23

标签: haskell

我有以下代码,它使用牛顿方法来近似某个数字的平方根。问题是,当我运行它时,我收到错误.. 有什么问题,我该如何解决?

newtonRootSequence :: Double -> [Double]
newtonRootSequence d = newtonSequenceGenerator d 1

newtonSequenceGenerator :: Double -> Double -> [Double]
newtonSequenceGenerator d xn = nxplus1 : newtonSequenceGenerator d nxplus1
    where nxplus1 =  (xn + d / xn) / 2

newtonRoot:: Double -> Double -> Double
newtonRoot d epsilon = head ([xs !! index | index <- [1..((length xs) - 1)], (xs !! index) - (xs !! index - 1) <= epsilon]
    where xs = newtonRootSequence d

错误:

 <interactive>:2:1: error:
        * No instance for (Show (Double -> Double))
            arising from a use of `print'
            (maybe you haven't applied a function to enough arguments?)
        * In a stmt of an interactive GHCi command: print it

运行它应该如下所示:

  

$ newtonRoot 35

2 个答案:

答案 0 :(得分:4)

在Haskell中,所有函数都被curryfied,所以,你的函数

newtonRoot:: Double -> Double -> Double

是“隐藏的括号”:

newtonRoot:: Double -> (Double -> Double)

如果您提供一个参数newtonRoot 35,那么

(newtonRoot 35) :: Double -> Double

并且函数f :: Double -> Double不是Show type class

的实例

您需要最后为函数值提供最后一个参数:

(newtonRoot 35 2) :: Double

双人可以展示

答案 1 :(得分:3)

newtonRoot有两个参数,depsilon。你没有提供epsilon。尝试

> newtonRoot 35 0.1

代替。

还有其他错误,但这应该让您开始调试路径。