Haskell 置换函数

Haskell Permute Function

这是我在这个网站上的第一个问题。所以如果我粗鲁或不够正式,我已经很抱歉了。
在我的离散数学中 class 教授向我们展示了这个置换函数

permute :: [a] -> [[a]]
permute [] = [[]]
permute xs = [y:zs| (y,ys) <- select xs, zs <- permute ys]

select :: [a] -> [(a,[a])]
select [] = []
select (x:xs) = (x,xs) : map(\(y,ys) ->(y,x:ys))(select xs)

这部分我没看懂

permute xs = [y:zs| (y,ys) <- select xs, zs <- permute ys]

我试着permute [1]理解清楚,在第一次递归中select xs需要[1]和returns [(1,[])]。然后permute ys[]如果我没记错的话

在第二次递归中,select 采用 [] 和 returns [] 。我在这里迷路了。正如我所见,它应该 return [[1],[]] 但它 returns [[1]].
如果有人帮助我,我会很高兴。

如果你调用 permute [1],那么 select [1] 将 return [(1, [])],这意味着列表理解将采用 y = 1ys = []。然后我们调用permute [],其中returns [[]]。因此,这意味着 zs 只会占用 zs = []。因此,我们将产生 [ y : zs ] 等价于 [ 1 : [] ],因此 [[]].

所以由于 zs <- permute [],因此等同于 zs <- [[]],这意味着它只迭代 一次 zs = []

如果你permute [1,2]那么我们就这样调用select [1,2],而这个return就是[(1, [2]), (2, [1])]。因此,这意味着在列表理解中,(y, ys) 将“迭代”两次:一次是 y=1ys=[2];后来 y=2ys=[1]。对于 (y, ys) 的每个值,它将调用 permutepermute [1] 将 return [[1]]permute [2] 将 return [[2]]。因此,这意味着我们将 return 一个包含以下内容的列表: [ 1 : [2], 2 : [1]] 因此相当于 [[1,2], [2,1]].