Функторы сами по себе не очень интересны, но они являются необходимой ступенькой для проникновения в аппликативные функторы и Traversables
.
Основное свойство, которое делает аппликативные функторы полезными, заключается в том, что вы можете использовать fmap
с аппликативным оператором <*>
, чтобы «поднять» любую функцию любой арности для работы с аппликативными значениями. То есть Вы можете превратить любой a -> b -> c -> d
в Applicative f => f a -> f b -> f c -> f d
. Вы также можете взглянуть на Data.Traversable
и Data.Foldable
, которые содержат несколько функций общего назначения с аппликативными функторами.
Alternative
- это специализированный аппликативный функтор, который поддерживает выбор между альтернативами, которые могут «потерпеть неудачу» (точное значение «пусто» зависит от аппликативного экземпляра). Аппликативные парсеры являются одним из практических примеров, когда определения some
и many
очень интуитивны (например, соответствуют некоторому шаблону ноль или более раз или один или более раз).
Монады - один из самых интересных и полезных типов классов, но они уже хорошо охвачены другими ответами.
Monoid
- это еще один класс типов, который одновременно прост и полезен. Он в основном определяет способ сложения двух частей данных, который затем дает вам общий concat
, а также функциональность в вышеупомянутом модуле Foldable
, и также позволяет использовать Writer
монада с типом данных.