这个函数如何处理 2 个列表?

How is this function dealing into 2 lists?

这个自创函数的目的是接受一个列表,并输出2个列表,它们将交替插入到列表中。所以 [4,5,1,6,7,8] 将被处理成 2 个列表,例如 ([4,1,7],[5,6,8])

deal :: [a] -> ([a],[a])
deal [] = ([],[])
deal [x] = ([x],[])
deal (x:xs) = let (ys,zs) = deal xs
              in (x:zs, ys)

这是函数。我不明白 let (ys,zs) = deal xs 发生了什么,我知道它基本上为 2 个列表创建了一个占位符但是有人可以引导我完成正在发生的递归。

根据定义,

deal [8] = ([8], [])

现在:

deal [7,8]
= deal (7:[8])
= let (ys,zs) = deal [8]
  in (7:zs, ys)
-- from the recursion we discover ys=[8], zs=[]
= (7:[], [8])
= ([7], [8])

再次:

deal [6,7,8]
= deal (6:[7,8])
= let (ys,zs) = deal [7,8]
  in (6:zs, ys)
-- from the recursion we discover ys=[7], zs=[8]
= (6:[8], [7])
= ([6,8], [7])

等等。每次我们递归时,我们都会交换前一个结果对并将一个项目添加到第一个组件之前。由于交换,这就像将一个元素添加到第一个组件,然后添加到第二个组件,然后再添加到第一个组件,依此类推,交替进行。粗略地说,这将列表分成两半。