我正在研究一种算法(点击链接查看),但是我并不是很理解作者提供的Haskell代码,因此需要你们的帮助。
我认为这些代码可以分为两个部分。
在这里,明确地定义了一种名为LFT(可能是Python中的元组)的类型以及三个名为
我相信
> type LFT = (Integer, Integer, Integer, Integer)
>
> extr :: LFT -> Integer -> Rational
> extr (q,r,s,t) x = ((fromInteger q) * x + (fromInteger r)) / ((fromInteger s) * x + (fromInteger t))
>
> unit :: LFT
> unit = (1,0,0,1)
>
> comp :: LFT -> LFT -> LFT
> comp (q,r,s,t) (u,v,w,x) = (q*u+r*w,q*v+r*x,s*u+t*w,s*v+t*x)
在这里,明确地定义了一种名为LFT(可能是Python中的元组)的类型以及三个名为
extr unit comp
的函数。然而,接下来的部分让我感到困惑:> pi = stream next safe prod cons init lfts where
> init = unit
> lfts = [(k, 4*k+2, 0, 2*k+1) | k<-[1..]]
> next z = floor (extr z 3)
> safe z n = (n == floor (extr z 4))
> prod z n = comp (10, -10*n, 0, 1) z
> cons z z’ = comp z z’
我相信
lfts
是一个生成器,但我无法理解代码中的循环。我对Haskell不是很了解。你能帮我把这个转换成Python或伪代码吗?
yield
关键字来描述一个生成器。Python将其视为连续体:如果你要求第一个元素,它将执行直到遇到第一个yield
语句,并暂停方法的执行。如果之后再请求下一个元素,它会再次执行并在产生第二个元素后暂停,依此类推。 - Willem Van Onsem