Монад-трансформаторы с идентичной монадой

17

Какой смысл использовать трансформатор Monad с монадией Identity, а не просто использовать «стандартную» версию трансформатора?

Является ли он более гибким?

    
задан Matthew H 11.04.2013 в 12:38
источник
  • Что вы подразумеваете под «стандартной» версией? –  Adrian 11.04.2013 в 12:42
  • Что значит «стандартная» версия трансформатора? Обычно стандартная версия трансформатора применяется к монодальной идентичности. –  leftaroundabout 11.04.2013 в 12:42
  • Я считаю, что некоторые из стандартных монад действительно определены как псевдоним для версии трансформатора, применяемой к Indentity. Это позволяет избежать дублирования кода для реализации монады дважды. –  Ben 11.04.2013 в 13:01
  • Нет ли тогда штрафа за производительность? Или GHC может полностью отключить монаду Identity? –  Joachim Breitner 11.04.2013 в 17:16
  • Для обертывания и разворачивания новых типов нет штрафа за производительность, поэтому обычно этого не происходит. –  Louis Wasserman 11.04.2013 в 23:29

2 ответа

30

В mtl 1.0 у нас были оба

newtype State s a = State { runState :: s -> (a, s) }

и

newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }

Однако это означало, что любой, кто должен был реализовывать экземпляры для таких вещей, как MonadState , наполнил дублирующее усилие.

В transformers (и теперь несуществующий monads-fd и monads-tf ) Росс Патерсон решил использовать более простой подход, предлагая только последний, и используя Identity в качестве базовой монады.

Это привело к уменьшению усилий по внедрению при сохранении mtl и устранении факта существования двух разных способов реализации монады State . Тем не менее, это сделало внутреннюю часть mtl труднее учить, потому что вам нужно понять версии transformers прямо из ворот и не получить упрощенную версию в качестве обучающих колес.

Когда старый mtl был удален, а monads-fd стал mtl 2.0, используя существующее transformers , это конструктивное решение было перенесено.

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

    
ответ дан Edward KMETT 11.04.2013 в 14:56
источник
  • Я полностью согласен с учебными целями. Может быть, мы должны создать пакет monads-learning, который содержит оригинальные более простые версии. –  Gabriel Gonzalez 11.04.2013 в 17:37
11

Из Документации: Вычислительно, нет оснований использовать монадию Identity вместо гораздо более простого действия простого применения функций к их аргументам. Цель монады Идентичности - ее фундаментальная роль в теории монадных трансформаторов. Любой монадный трансформатор, примененный к Монаде Идентичности, дает версию без трансформатора этой монады.

Как я понимаю, получение не-трансформаторной версии монады из монадного трансформатора путем применения идентичной монады - это именно то, для чего существует точная монада. Нет преимущества перед использованием не-трансформаторной монады, но иногда вам приходится использовать трансформатор монады, например. когда требуется функция, которую вы хотите использовать.     

ответ дан tauli 11.04.2013 в 12:50
источник