Применяется ли термин "монада" к значениям типов, таких как Maybe или List, или он применяется только к самим типам?

Я заметил, что слово "монада", кажется, используется несколько непоследовательно. Я пришел к выводу, что это потому, что многие (если не большинство) учебников монады там написаны людьми, которые только начали понимать монады сами (например: буррито из ядерных отходов), и поэтому термин заканчивается тем, что он перегружен/поврежден.

в частности, мне интересно, может ли термин "монада" применяться к отдельным значениям таких типов, как Возможно, List или IO, или если термин "монада" действительно должен применяться только к самим типам.

Это тонкое различие, поэтому, возможно, аналогия могла бы сделать его более ясным. В математике мы имеем, кольца, поля, группы и т. д. Эти термины применяются ко всему набору значений вместе с операциями, которые могут быть выполнены над ними, а не к отдельным элементам. Например, целые числа (наряду с операциями сложения, отрицания и умножения) образуют кольцо. Ты мог бы ... сказать "целое кольцо", но вы никогда не скажет "5 кольцо".

Итак, вы можете сказать:"Just 5 это монада", или это было бы так же неправильно, как сказать: "5-это кольцо"? Я не знаю теории категорий, но у меня такое впечатление, что действительно имеет смысл сказать "Maybe является монадой "и не"Just 5 - это монада".

5 ответов


List - это монада, List a является типом, и [] это List a (элемент типа).

технически, монада -функтор С дополнительной структурой; и в Haskell мы используем только функторы из категории типов Haskell для себя.

это, в частности, "функция", которая принимает тип и возвращает другой тип (он имеет вид * -> *).

List, State s, Maybe и т. д. являются монады. State не является монадой, так как он имеет вид * -> * -> *.

(в стороне: чтобы запутать вопросы, монады - это просто функторы, и если я дам себе частично упорядоченное множество A, то оно образует категорию, С Hom(a, b) = { 1 элемент}, если a A образует функтор, а монады-это те функции, которые удовлетворяют x A". См. также закрытие операторы.)

(кроме 2: поскольку вы, кажется, знаете некоторую математику, я призываю вас прочитать о теории категорий. Вы увидите, среди прочего, что алгебраические структуры можно рассматривать как возникающие из монад. См.этот отличный блог запись отличный блог исполнителя Dan Piponi для тизера.)


"Монада" (и "функтор") в народе неправильно. в описании значения. Никакое значение не является монадой, функтором, моноидом, аппликативным функтором и т. д. Могут быть только типы и конструкторы типов (типы более высокого типа). Когда вы слышите (и вы будете), что" списки-моноиды "или" функции-монады "и т. д., Или" эта функция принимает монаду в качестве аргумента", не верьте этому. Спросите говорящего: "как может любое значение быть моноидом (или монадой или...), учитывая, что классы Haskells классифицируются типы (включая более высокие порядки), а не значения?" Списки не являются моноидами (etc). List a есть.

почему имеет значение, используем ли мы язык точно? Потому что мы думаем на языке, и мы строим и передаем понимание через язык. Поэтому, чтобы иметь ясные мысли, помогает иметь ясный язык (или быть в состоянии в любое время).


если быть точным, монады-это структуры из теории категорий. У них нет прямого аналога кода. Для простоты давайте поговорим об общих функторах вместо монад. В случае Haskell грубо говоря, функтор-это отображение из класса типов в класс типов,который также отображает функции в первом классе на функции во втором. The Functor экземпляр дает вам доступ к функции отображения, но не напрямую отражающих концепцию функторы.

однако справедливо сказать, что конструктор типов, как указано в Functor экземпляр является фактическим функтором:

instance Functor Tree

в этом случае Tree - это функтор. Однако, потому что Tree является конструктором типа, который не может стоять для обеих функций отображения, которые делают функтор одновременно. Функция, отображающая функции, называется fmap. Поэтому, если вы хотите быть точным, вы должны сказать, что кортеж (Tree, fmap) является функтором, где fmap is в частности fmap С Tree ' s Functor экземпляра. Для удобства, опять же, мы говорим, что Tree является функтором, потому что соответствующий fmap вытекает из его Functor экземпляра.

обратите внимание, что функторы всегда видах рода * -> *. Так что Maybe Int не является функтором-функтор Maybe. Также часто говорят о "государственной монаде", что тоже неточно. State - это целое семейство бесконечно многих государственных монад, как вы можете видеть в пример:

instance Monad (State s)

для каждого типа s конструктор типа State s (типа * -> *) составляет a государственная монада, одна из многих.


ваша интуиция совершенно верно. Int Это Ring (или AbelianGroup или что угодно) как Maybe - это Monad (или Functor или любой другой). Значения (5, Just 5, etc.) не имеют значения.

в алгебре, мы говорим, что множество целых чисел форма кольцо; в Haskell мы бы сказали (неофициально), что Int является членом Ring typeclass, или (немного более формально), что существует Ring экземпляр Int. Вы можете найти это предложение весело и / или полезно. В любом случае, то же самое с монадами.

Я не знаю теории категорий, но ...

как бы то ни было, если вы знаете что-то об абстрактной алгебре, вы Золотой.


Я бы сказал "Просто 5 имеет тип, который является экземпляром монады", как я бы сказал "5-это число, которое имеет тип (целое число) - это кольцо".

Я использую термин экземпляр, потому что в Haskell вы объявляете реализацию класса typeclass, и Монада является одним из них.