haskell 中的 Heron 方法

Heron's method in haskell

我在 heron 方法的这段代码中遇到除以零的异常,我有点迷路了。

epsilon:: Integral a => a
epsilon = 1

heron:: Integral a => a -> a
heron r = help 0
  where
    help x
      | abs (heron' x - heron' (x + 1)) < epsilon = heron' (x + 1)
      | otherwise                                 = help (x + 1)

    heron' 0 = 1
    heron' x = (1 `div` 2) * (heron' (x-1) + (r `div` heron' (x-1)))

我必须在这段代码中寻找解决此问题的任何建议吗?

(1 `div` 2)肯定是个问题,但是我需要写什么呢?

如果您需要这种除法,您可能希望使用 (/) 而不是 divFractional 而不是 Integral。所以:

epsilon:: Fractional a => a
epsilon = 1

heron:: (Fractional a, Ord a) => a -> a
heron r = help 0
  where
    help x
      | abs (heron' x - heron' (x + 1)) < epsilon = heron' (x + 1)
      | otherwise                                 = help (x + 1)

    heron' 0 = 1
    heron' x = (1 / 2) * (heron' (x-1) + (r / heron' (x-1)))