Haskell函数以无限列表作为参数

时间:2017-06-14 05:07:59

标签: haskell

在涉及无限列表和我的错误消息的其他帖子之后,我仍然无法解决我的问题。

我正在学习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函数,用withinrepeat_调用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_接受函数?

非常感谢任何帮助!谢谢!

0 个答案:

没有答案