2015-08-24 3 views
17

free MonadPlus определяется какЧто случилось с Control.MonadPlus.Free?

data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a] 

был удален в свободной 4.6 со следующим замечанием (changelog):

Удалены Control.MonadPlus.Free. Вместо этого используйте FreeT f [], и результат будет законопослушным.

В чем была проблема, в частности, какие законы не выполнялись?

ответ

13

В соответствии с этим issue в трекере ошибок старое определение не подчиняется ассоциативному закону.


Хотя я немного о таких вещах знать, я подозреваю другая проблема является избыточностью:

Pure a 
Plus [Pure a] 
Plus [Plus [Pure a]] 
... 

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

На самом деле, я думаю, что предлагаемая альтернатива страдает от одной и той же проблемы, хотя ее можно было бы исправить, используя NonEmpty вместо []. Таким образом, это изменение может быть просто вопросом удаления избыточного крутизны из библиотеки.

+3

Вы не должны использовать такие вещи, как «обновление» или «редактирование» в сообщении. История изменений более чем достаточно, чтобы посмотреть, когда что-то было изменено/добавлено. Я взял на себя смелость удалить их (но не содержимое) и переместить часть, которая ссылается на трекер ошибок наверху, чтобы он был более доступным. – Bakuriu

+0

@ Бакуриу Действительно? Итак, вместо того, чтобы сразу увидеть, что что-то изменилось, мы должны копаться в истории изменений? Является ли обычный способ слишком простым? – MigMit

+3

@MigMit «Обычный способ», как вы его называете, - ** шум **. Если я ищу ответ, почему я должен прочитать сотни строк несвязанных «изменений», чтобы в итоге получить 2-строчный ответ? Ответ должен максимизировать полезность, что означает читаемость и легкодоступность.Разделение информации на различные блоки обычно не является хорошим решением. Это может быть хорошо, когда вопрос/ответ все еще неясен/неполный, но как только ясно, что контент должен быть хорошо организован. Если кому-то интересно узнать, как он развивается, он может посмотреть историю изменений, но это метаданные. – Bakuriu

1

Я считаю, что само представление было в порядке, и что законность могли бы быть устранены путем изменения этих сигнатур методов

iter :: Functor f => (f a -> a) -> ([a] -> a) -> Free f a -> a 
iterM :: (Monad m, Functor f) => (f (m a) -> m a) -> ([m a] -> m a) -> Free f a -> m a 

в

iter :: (Functor f, Monoid a) => (f a -> a) -> Free f a -> a 
iterM :: (MonadPlus m, Functor f) => (f (m a) -> m a) -> Free f a -> m a 

т.е.

  • использования Monoid a вместо произвольно funct ион [a] -> a в iter;
  • MonadPlus m вместо произвольный функция [m a] -> m a в iterM.

Я предполагаю, что он был удален (вместо фиксированного) только потому, что не стоит останавливаться, когда FreeT f [] дает эквивалентное представление.

Смежные вопросы