Wil*_*ess 6 iteration haskell fold
想象一下,您需要折叠序列,并且还想知道该范围内多个点的中间值.这就是我用过的:
[a,b,c] = map fst . tail $ chain [g i, g j, g k] (zero, sequence)
g :: Integer -> (a,b) -> (a,b)
chain (f:fs) x = x : chain fs (f x)
chain [] x = [x]
Run Code Online (Sandbox Code Playgroud)
该功能g消耗的输入序列(长度的规定部分i,j等),开始某个初始值,并产生相同类型的结果,要被送入下一个调用.从开始和相同的初始值开始,对于不同长度的序列多次使用将是低效的,当然,无论是时间还是空间.
所以一方面我们折叠整数序列 - 序列上的中间点; 另一方面,我们迭代这个函数,g.它是什么?我错过了一些基本的东西吗?这可以用普通的折叠曲目等表达出来吗?
编辑:已解决: 以上是简单的
[a,b,c] = map fst . tail $ scanl (flip g) (zero, sequence) [i, j, k]
Run Code Online (Sandbox Code Playgroud)
有趣的是,可修改的迭代实际上是如何折叠修饰符列表.
请尝试scanl:http://www.haskell.org/hoogle/? soogle = scans
scanl类似于foldl,但从左侧返回连续减少值的列表:
Run Code Online (Sandbox Code Playgroud)scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]注意
Run Code Online (Sandbox Code Playgroud)last (scanl f z xs) == foldl f z xs