#haskell #monads
#haskell #монады
Вопрос:
В чем разница между Writer
и WriterT
в Haskell? Является ли одно предпочтительным по сравнению с другим?
Ответ №1:
Разница в том, что Writer
это монада, тогда WriterT
как это монадный преобразователь, то есть вы даете ему некоторую базовую монаду, и она возвращает вам новую монаду с функциями «writer» сверху. Если вам нужны только функции, специфичные для writer, используйте Writer
. Если вам нужно объединить его эффекты с какой-либо другой монадой, например IO
, используйте WriterT
.
Комментарии:
1. Также обратите внимание, что
Writer
это определяется с помощьюWriterT
. Точнее, у нас естьtype Writer w = WriterT w Identity
. ВотIdentity
монада, которая не имеет никакого эффекта. То есть мы даемWriterT
монаду без эффекта и получаемWriter
монаду.2. Я никогда не мог понять, каким образом визуализировать
Monad
стек. Здесь вы говорите, что функции writer находятся сверху, но для доступа кMonad
нижеприведенному вы используетеlift
, что заставляет меня визуализировать writer как находящийся внизу.3. @pat: Ну, как я думаю об этом, вы поднимаете нижнюю монаду до того же уровня, что и writer .
Ответ №2:
Чтобы добавить к отличным объяснениям выше, я хотел бы также указать на эту статью . Мне это очень помогло:
Комментарии:
1. Эта ссылка происходит с 404, вот новая ссылка для тех, кто наткнулся на это, как у меня: page.mi.fu-berlin.de/scravy/realworldhaskell/materialien /…
2. Это снова 404.