Внутренний список отображается в выходных данных как внешний список, но список тем не менее является списком.
Другой способ сказать это так:
foreach x in [[1,2],[3,4]]:
foreach y in x:
emit y
а также
foreach x in [1,2,3,4]:
emit x
«одинаковы» в отношении испускаемых элементов.
Я считаю, что презентации шрифтов с выстроенными в ряд субсущностями очень визуально привлекательны:
(>>=) :: m a -> (a -> m b) -> m b
[[1,2],[3,4]] :: [[Int]] -- actually, (Num a) => [[a]], but never mind that
\x -> x :: a -> a
(>>=) :: m a -> ( a -> m b) -> m b
(>>=) [[1,2],[3,4]] :: ( a -> m b) -> m b m a ~ [[Int]]
(>>=) [[1,2],[3,4]] :: ( a -> [b]) -> [b] m ~ []
(>>=) [[1,2],[3,4]] :: ([Int] -> [b]) -> [b] a ~ [Int]
(>>=) [[1,2],[3,4]] (\ x -> x ) :: [b] [b] ~ [Int]
(>>=) [[1,2],[3,4]] (\ x -> x ) :: [Int] b ~ Int
-- actually, (Num b) => b
Вот, оказывается, \ x -> x :: (Num b) => [b] -> [b], а не только a -> a.
Видите ли, когда ([Int] -> [b]) сопоставляется с типом (\ x -> x), создавая эквивалентность [Int] ~ [b], [] в [Int] происходит из "внутреннего списка", a в m a; а [] в [b] происходит из "внешнего списка", m в m b; но список есть список, как было сказано выше.
И это то, что позволяет разбить («объединить») два уровня списка в один, «сгладить» список или, в более общем смысле, «объединить» два «уровня» монады в один.
Другой способ увидеть это — расширить монадический код его конкретной версией списка:
[[1,2],[3,4]] >>= \x -> x
=== concatMap id [[1,2],[3,4]] === concat [ x | x <- [[1,2],[3,4]]]
=== concat [id [1,2], id [3,4]] === [ y | x <- [[1,2],[3,4]], y <- x]
=== [1,2,3,4] === [1,2,3,4]
Все, что имеет значение для f в concatMap f, это то, что это функция, производящая список: f :: a -> [b].
И concatMap id === concat :: [[a]] -> [a] — вполне законная функция. Да, concat равно join для монады списка:
ma >>= f === join (fmap f ma) -- or, for lists,
=== concat (map f ma)
=== concatMap f ma -- the definition that we used above
person
Will Ness
schedule
29.11.2014
aиm bне обязательно должны быть разными. В вашем случае у вас естьa = [Int]иb = Intиm = []. - person n. 1.8e9-where's-my-share m.   schedule 29.11.2014