Я читаю Хаскелла Саймона Томпсона: ремесло функционального программирования , и мне интересно, как это работает:
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
?