在涉及无限列表和我的错误消息的其他帖子之后,我仍然无法解决我的问题。
我正在学习Haskell,我认为实现Newton-Raphson Square Root方法将是一个有趣的第一个问题。这是我的代码:
next_ :: (Floating a) => a -> a -> a
next_ n x = (x + n/x)/2
repeat_ :: (Floating a) => ( a -> a ) -> a -> [a]
repeat_ f a = a : (repeat_ f (f a))
within :: (Ord a, Floating a) => a -> [a] -> a
within eps (x:xs)
| (abs (x / b - 1.0)) < eps = b
| otherwise = within eps (b:bs)
where b = head xs
bs = tail xs
代码由GHCi编译得很好。 eps
是返回最终答案之前2个连续平方根近似值之间的最大距离。
我将这三个部分分成三个部分,目的是编写一个sqrt
函数,用within
和repeat_
调用next_
。我测试了repeat_
和next_
,它们都按预期工作。但是,当我运行within .01 (repeat_ (next_ 2.0) 2.5)
时,我收到以下错误消息:
<interactive>:44:1: error:
• Non type-variable argument
in the constraint: Num ([a] -> a2 -> a1)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a a1 a2.
(Num ([a] -> a2 -> a1), Floating a, Floating a1, Ord a1) =>
a2 -> [a1] -> a1
阅读错误消息并使用Google搜索,我仍然迷失方向。我在这里已经阅读了类似的问题,无法解决问题。我认为,这个问题是无限列表作为一个论点。我知道Haskell是懒惰的,所以它只会在满足返回条件之前评估所需的数量。我认为上面的实现是正确的(即inf。列表的(x:xs)
),但我不确定。类型类也是一个值得关注的领域。在搜索和阅读之后,我对within
的类型类仍感到不稳定。由于在函数中正在计算无限列表,是否需要一个类型声明,如repeat_
,其中声明repeat_
接受函数?
非常感谢任何帮助!谢谢!