Проблема в понимании типа последовательности [Just, Just]

Я в замешательстве, почему я получил это в GHCi

:t sequence [Just,Just]
sequence [Just, Just] :: a -> [Maybe a]

Чтобы разработать, я могу понять sequence [Just 1, Just 2] :: Num a => Maybe [a], потому что, глядя на тип последовательности

sequence :: (Monad m, Traversable t) => t (m a) -> m (t a)

ясно, что эта функция принимает коллекцию монадических значений и возвращает одно монадическое значение коллекции. Таким образом, когда мы вызываем sequence [Just 1, Just 2], мы должны вернуть a Just of [1,2]. После этого мыслей не следует sequence [Just, Just] вернуть один Just?

Спасибо.

Ответы

Ответ 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]).