我正在阅读Simon Thompson的 Haskell:函数式编程工艺,我想知道它是如何工作的:
perms [] = [[]]
perms xs = [ x:ps | x <- xs , ps <- perms ( xs\\[x] ) ]
我似乎无法理解perms( xs\\[x] )
应该如何运作。两个元素列表的跟踪显示:
perms [2,3]
[ x:ps | x <- [2,3] , ps <- perms ( [2,3] \\ [x] ) ] exe.1
[ 2:ps | ps <- perms [3] ] ++ [ 3:ps | ps <- perms [2] ] exe.2
...
你如何从exe.1
转到exe.2
?
答案 0 :(得分:4)
好吧,它只是将2
和3
分别插入[2,3] \\ [x]
。你有
[ 2:ps | ps <- perms ([2,3] \\ [2]) ] ++ [ 3:ps | ps <- perms ([2,3] \\ [3]) ]
由于\\
是差异运算符,即它返回第一个列表中不在第二个列表中的元素,因此结果分别为[3]
和[2]
。
答案 1 :(得分:4)
基本上说:
x
(xs
)x <- xs
ps
列表xs\\[x]
的排列(即xs
已删除x
) - perms ( xs\\[x] )
perms(xs\\[x])
是从x
删除xs
的递归调用。