Writer против WriterT в Haskell

#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.