Использует ли термин "монада" к значениям типов типа "Возможно" или "Список", или же он применяется только к самим типам?

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Моя догадка заключается в том, что это популярное злоупотребление связано с основными языками, имеющими классы ценности, а не с типами классов, так что пронизывает привычное бессознательное мышление класса ценности.

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

"Неловкость нашего языка облегчает нам глупые мысли. Дело в том, что этот процесс обратим". - Джордж Оруэлл, Политика и английский язык

Изменить: эти замечания относятся к Haskell, а не к более общей настройке теории категорий.

Ответ 3

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

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

instance Functor Tree

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

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

instance Monad (State s)

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

Ответ 4

Итак, можете ли вы сказать: "Только 5 - это монада", или это было бы так же неправильно, как сказать "5 - это кольцо"?

Ваша интуиция в точности верна. Int имеет значение Ring (или AbelianGroup или что-то еще), поскольку Maybe имеет значение Monad (или Functor или что-то еще). Значения (5, Just 5 и т.д.) Несущественны.

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

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

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

Ответ 5

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

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