Ответ 1
Второй sequence
работает в другой монаде.
Для первого:
sequence [Just 1, Just 2]
имеем Just 1 :: Maybe a
, и это значение в монаде Maybe
. Конкретно, тип [Maybe a]
сопоставляется с t (m b)
, как требуется последовательностью, и мы получаем t ~ []
, m ~ Maybe
, b ~ a
- следовательно, монада Maybe
.
Для второго:
sequence [Just, Just]
имеем Just :: a -> Maybe a
. В какой монаде это? Теперь тип [a -> Maybe a]
сопоставляется с t (m b)
, и мы получаем t ~ []
, m ~ (->) a
, b ~ Maybe a
- следовательно, теперь мы работаем в монаде (->) a
и больше не в Maybe
.
В этой монаде (->) a
, которая изоморфна монаде Reader a
, мы имеем, например,
sequence [f, g, h] = \x -> [f x, g x, h x]
Действительно, вычисление с монадой (->) a
является вычислением "чтение неявного аргумента типа a
". Функция sequence
просто превращает список таких вычислений ([(->) a b]
, т.е. [a -> b]
) в одно вычисление, которое читает неявный аргумент только один раз и создает список со всеми результатами
((->) a [b]
, т.е. a -> [b]
).