为什么我翻译成Python的Haskell不能正常工作?

Wes*_*Wes 5 python math 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)
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

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()
Run Code Online (Sandbox Code Playgroud)

它应该输出列表的下两个值,例如5.0,3.4

但它输出5.0两次,为什么?

YOU*_*YOU 11

如果再次调用展开,您的生成器将再次重新生成,因此您需要将其分配给变量.

>>> res = unfold(acc, 1)
>>> print res.next()
5.0
>>> print res.next()
3.4
>>>
Run Code Online (Sandbox Code Playgroud)

  • @Wes这不是思考它的正确方法.`unfold`是一个返回生成器的函数,特别是每次调用它时都会生成一个新生成器.如果你创建了一个生成器,在它上面调用.next()并扔掉它,它的所有状态都消失了. (10认同)