开发者

Why doesn't this Haskell I translated to Python work properly?

开发者 https://www.devze.com 2023-03-30 08:26 出处:网络
Haskell: average x y = (x + y) / 2 sqrt\' :: (Ord a, Fractional a) => a -> Int -> a sqrt\' 0 _ = 0.0

Haskell:

average x y = (x + y) / 2

sqrt' :: (Ord a, Fractional a) => a -> Int -> a
sqrt' 0 _ = 0.0
sqrt' 1 _ = 1.0
sqrt' s approximations = (infsqr' s) !! approximations

infsqr' n = unfoldr acc 1 where
    acc guess | guess < 0 = Nothing
              | otherwise = Just (newguess', newguess') where
                newguess' = average guess (n / guess)

Python:

def unfold(f, x):
    while True:
        w, x = f(x)
        yield w

def average(x, y):
    return float((x + y) / 2)

def acc(guess):
    if guess < 1:
        return None
    else:
        newguess = average(guess, (float(n/guess)))
        return (newguess, newguess) 
n = 9
print unfold(acc, 1).next()
print unfold(acc, 1).next()

It should output the next two values of the list, e.g. 5.0开发者_JS百科, 3.4

But it outputs 5.0 twice, why?


If you called unfold again, your generator will regenerate again, so you need to assign it to variable.

>>> res = unfold(acc, 1)
>>> print res.next()
5.0
>>> print res.next()
3.4
>>>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号