交错列表的“标准”(或者也许是著名的)方式,早在 SICP(以及后来的 Reasoned Scheme)的欢乐日子里,是
infixr 5 ++/
[] ++/ ys = ys
(x:xs) ++/ ys = x:(ys ++/ xs)
可以和foldr一起使用,
*Main> foldr (++/) [] [[1,2,3],[4,5,6],[7,8]]
[1,4,2,7,3,5,8,6]
这显然不会按您想要的顺序产生结果,但是当列表的输入列表是无限的时,它会正常工作。我认为没有办法同时满足这两个要求,因为我们无法知道输入列表是否是无限的。
如果修改为始终在1 的距离处插入而不是d+1,则上述结果是来自Daniel's answer 的函数insertAtDistance 将产生的结果:
insertAtDistance xs (d, ys) = (1, helper d xs ys)
当使用d+1 定义时,它会产生“扁平”交织,而foldr (++/) [] 会产生倾斜交织:
*Main> take 20 $ foldr (++/) [] [cycle[i] | i<-[1..]]
[1,2,1,3,1,2,1,4,1,2,1,3,1,2,1,5,1,2,1,3]