52700.fb2
(=<< )
:: Monad m => (a -> m b) -> m a -> m b
(=<< ) = flip (>>=)
Поменяв аргументы местами, мы получили знакомую функцию *$. Итак функция связывания это функция
применения специальной функции к специальному значению. У неё как раз такой смысл.
В Prelude определены экземпляры класса Monad для типов Maybe и [].
Они определены по такому же принципу, что и наши определения для Kleisli только не для композиции, а
для применения.
Отметим, что в модуле Control.Monad определены функции sequence и mapM, они несут тот же смысл,
что и функции sequence и mapК, которые мы определяли для класса Kleisli.
Свойства классов
Посмотрим на свойства функторов и аппликативных функторов.
Функторы и монады | 97
Свойства класса Functor
fmap id x
== x
-- тождество
fmap f . fmap g
== fmap (f . g)
-- композиция
Первое свойство говорит о том, что если мы применяем fmap к функции тождества, то мы должны снова
получить функцию тождества, или по другому можно сказать, что применение функции тождества к специ-
альному значению не изменяет это значение. Второе свойство говорит о том, что последовательное примене-
ние к специальному значению двух обычных функций можно записать в виде применения композиции двух
обычных функций к специальному значению.
Если всё это звучит туманно, попробуем переписать эти свойства в терминах композиции:
mf +> id
== mf
(mf +> g) +> h
== mf +> (g >> h)
Первое свойство говорит о том, что тождественная функция не изменяет значение при композиции. Вто-
рое свойство указывает на ассоциативность композиции одной специальной функции mf и двух обычных
функций g и h.
Свойства класса Applicative
Свойства класса Applicative, для наглядности они сформулированы не через методы класса, а через
производные функции.
fmap f x
== liftA f x
-- связь с Functor
liftA
id x
== x
-- тождество
liftA3 (. ) f g x
== f <*> (g <*> x)
-- композиция
liftA
f (pure x)
== pure (f x)