Haskell递归:Haskell ch.11编程中的交错函数

Haskell递归:Haskell ch.11编程中的交错函数,haskell,recursion,Haskell,Recursion,在Haskell Ch.11的编程中,我无法理解以下“interleave”函数的递归机制是如何工作的 -- Definition interleave :: a -> [a] -> [[a]] interleave a [] = [[a]] interleave x (y:ys) = (x:y:ys):map (y:) (interleave x ys) -- Example > interleave 3 [4,5,6,7] [[3,4,5,6,7],[4,3,5,6,7]

在Haskell Ch.11的编程中,我无法理解以下“interleave”函数的递归机制是如何工作的

-- Definition
interleave :: a -> [a] -> [[a]]
interleave a [] = [[a]]
interleave x (y:ys) = (x:y:ys):map (y:) (interleave x ys)

-- Example
> interleave 3 [4,5,6,7]
[[3,4,5,6,7],[4,3,5,6,7],[4,5,3,6,7],[4,5,6,3,7],[4,5,6,7,3]]
它在引擎盖下是如何工作的

我总是这样推理:

interleave 3 [4,5,6,7]
= [3,4,5,6,7]:map (4:) (interleave 3 [5,6,7])
= [3,4,5,6,7]:[4,3,5,6,7]:map (5:) (interleave 3 [6,7])
= [3,4,5,6,7]:[4,3,5,6,7]:[5,3,6,7]:map (6:) (interleave 3 [7])
= [3,4,5,6,7]:[4,3,5,6,7]:[5,3,6,7]:[6,3,7]:map (7:) (interleave 3 [])
= [3,4,5,6,7]:[4,3,5,6,7]:[5,3,6,7]:[6,3,7]:[7,3]:[[3]]

= [[3,4,5,6,7],[4,3,5,6,7],[5,3,6,7],[6,3,7],[7,3],[3]]
???
/= [[3,4,5,6,7],[4,3,5,6,7],[4,5,3,6,7],[4,5,6,3,7],[4,5,6,7,3]]

请开导我。。非常感谢。

在第二行和第三行之间,您错过了一些东西:

[3,4,5,6,7]:映射(4:)(交错3[5,6,7])
=[3,4,5,6,7]:映射(4:)([3,5,6,7]:映射(5:)(交错3[6,7]))
=[3,4,5,6,7]:[4,3,5,6,7]:映射(4:)(映射(5:)(交错3[6,7]))

因此,最后你有一堆
映射(x:)
,所有列表都包含原始列表的所有元素

你想用代码来定义
交错
方法吗?