Еще один взгляд на это:
ghci> :m +Data.List
ghci> :m +Control.Applicative
ghci> let l1 = [x | x:xs <- tails [1,2,3]]
ghci> l1
[1,2,3]
ghci> let l2 = [xs | x:xs <- tails [1,2,3]]
ghci> l2
[[2,3],[3],[]]
Ваше первое понимание рисует x
и xs
как «пару», что-то вроде того, что они держатся «застегнутыми» вместе.
ghci> zipWith (:) l1 l2
[[1,2,3],[2,3],[3]]
Ваше второе понимание рисует все комбинации x
и xs
, комбинируя их с (:)
.
ghci> (:) <$> l1 <*> l2
[[1,2,3],[1,3],[1],[2,2,3],[2,3],[2],[3,2,3],[3,3],[3]]