这种折叠和迭代模式是什么?

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)

有趣的是,可修改的迭代实际上如何折叠修饰符列表.

Mar*_*cin 9

请尝试scanl:http://www.haskell.org/hoogle/? soogle = scans

scanl类似于foldl,但从左侧返回连续减少值的列表:

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