Давай без сахара!
[ x:y | x <- [], y <- [] ]
Превращается в
do x <- []
y <- []
return (x:y)
Теперь, больше обезвоживания! Ура!
[] >>= \x -> ([] >>= \y -> return (x:y))
iirc, >>=
для списков - flip concatMap
, а return
- просто \x -> [x]
Давайте сделаем лишь небольшую часть этой замены.
concatMap (\x -> ([] >>= \y -> return (x:y))) []
Там, теперь вы видите? concatMap f []
явно оценивается в []
. Потому что concatMap f
это просто concat . map f
. Поэтому сопоставьте f
с пустым списком и затем объедините результаты. За исключением отсутствия результатов, итоговая оценка составляет []
.