У меня болит мозг, и я не эксперт, но я думаю:
В
perms xs = [ x:y | i <- [0..(length xs - 1)], x <- [xs!!i], y <- perms (takeOut i xs)]
perms (takeOut i xs) - список списков. x ограничен каждым элементом этого списка. Perms вызывается из списка в целом, поэтому perms - это функция, принимающая список вещей.
В
perms xs = [ x:(perms y) | i <- [0..(length xs - 1)], x <- [xs!!i], y <- (takeOut i xs)]
(takeOut i xs) является списком, и для каждого элемента этого списка x ограничен в разрешении этого элемента. Perms вызывается для каждого элемента списка, поэтому perms - это функция, принимающая вещи.
Только первый случай является внутренне непротиворечивым, и проверщик типов любит вас.