我有以下代码,它使用牛顿方法来近似某个数字的平方根。问题是,当我运行它时,我收到错误.. 有什么问题,我该如何解决?
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
答案 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
有两个参数,d
和epsilon
。你没有提供epsilon
。尝试
> newtonRoot 35 0.1
代替。
还有其他错误,但这应该让您开始调试路径。