Применяется ли термин "монада" к значениям типов, таких как 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, и Монада является одним из них.