Я изучаю Typeclassopedia, чтобы узнать классы типов. Я застрял в понимании Alternative
(и MonadPlus
, если на то пошло).
Проблемы, которые у меня возникают:
-
"pedia говорит, что" класс альтернативного типа предназначен для аппликативных функторов, которые также имеют моноидную структуру ". Я не понимаю, не означает ли альтернатива что-то совершенно отличное от Monoid? т.е. я понял смысл класса типа Alternative как выбор между двумя вещами, тогда как я понял, что моноиды связаны с объединением вещей.
-
зачем Альтернативе нужен метод/член
empty
? Возможно, я ошибаюсь, но, похоже, он не используется вообще... по крайней мере, в код, который я мог найти. И, похоже, это не соответствует теме класса - если у меня есть две вещи и нужно выбрать один, для чего мне нужен "пустой" для? -
почему класс альтернативного типа нуждается в аппликативном ограничении и зачем ему нужен
* -> *
? Почему не просто<|> :: a -> a -> a
? Все экземпляры все равно могут быть реализованы таким же образом... Я думаю (не уверен). Какое значение оно дает, что Monoid не делает? -
какая точка класса типа
MonadPlus
? Разве я не могу разблокировать все его доброту, просто используя что-то какMonad
иAlternative
? Почему бы просто не остановить его? (Я уверен, что ошибаюсь, но у меня нет контрпримеров)
Надеемся, что все эти вопросы будут согласованными...!
Обновление Bounty: @Ответ на вопрос - отличный старт, но Q3 все еще открыт: что альтернатива предусматривает, что Monoid этого не делает? Я нахожу этот ответ неудовлетворительным, поскольку в нем отсутствуют конкретные примеры, а также конкретное обсуждение того, как более высокая сословность Alternative отличает его от Monoid.
Если он сочетает аппликативные эффекты с поведением Monoid, почему бы не просто:
liftA2 mappend
Это еще более запутанно для меня, потому что многие экземпляры Monoid точно такие же, как альтернативные экземпляры.
Вот почему я ищу конкретные примеры, которые показывают, почему нужна альтернатива и как она отличается - или означает что-то другое - от Monoid.