Я возился с примером перестановок из книги.Следующий код работает по назначению.
perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
И когда я подставляю выражения, он становится таким:
[ [1 | perms([2])],
[2 | perms([1])] ]
[ [1 | [[2 | perms([])]]],
[2 | [[1 | perms([])]]] ]
[ [1 | [ [2 | [[]] ] ]],
[2 | [ [1 | [[]] ] ]] ]
И это правильно оценивается как [[1,2], [2,1]].
Но когда я изменил базовый случай на пустой список, из списка появляется пустой список:
perms([]) -> [];
Возвращает пустой список.Когда я заменил, я получил это.
[ [1 | [[2 | [] ]]],
[2 | [[1 | [] ]]] ]
Я попробовал оба выражения с flatten, но они дали тот же и правильный результат.
[[1 | lists:flatten([[2 | lists:flatten([[]]) ]])], [2 | lists:flatten([[1 | lists:flatten([[]]) ]])]]
[[1 | lists:flatten([[2 | lists:flatten([]) ]])], [2 | lists:flatten([[1 | lists:flatten([]) ]])]].
Так что я не мог понять разницу между двумявыражения.