Я изучаю Haskell, и одной из моих практических функций была простая рекурсивная перестановка
. Я адаптировал решение, описанное здесь , и первоначально получил следующее:
selections [] = []
selections (x:xs) = (x, xs) : [ (y, x:ys) | (y,ys) <- selections xs ]
permute xs = [y:ps | (y,ys) <- selections xs, ps <- permute ys]
(Да, это могло быть короче, но я стремился к ясности и ясности.)
Однако эта версия меняет
всегда возвращал пустой список! Немного поработав, я заставил его работать, изменив permute
на:
permute [] = [[]]
permute xs = [y:ps | (y,ys) <- selections xs, ps <- permute ys]
Тем не менее, я все еще озадачен , почему исходная версия всегда возвращает пустой список .