Класс типов Monad определен следующим образом:
Вместо m подставляются конкретные однопараметрические конструкторы. Kind типа m должен быть * -> *.
Функция return берет некоторое значение и некоторым тривиальным образом упаковывает его в контейнер m.
Prelude> :t return
return :: Monad m => a -> m a
Prelude> :t return True
return True :: Monad m => m Bool
Вместо m подставляются конкретные однопараметрические конструкторы. Kind типа m должен быть * -> *.
Функция return берет некоторое значение и некоторым тривиальным образом упаковывает его в контейнер m.
Prelude> :t return
return :: Monad m => a -> m a
Prelude> :t return True
return True :: Monad m => m Bool
Здесь возвращается некоторая полиморфная конструкция. Внутри контейнера лежит значение Bool, а сам контейнер полиморфен, на него наложено ограничение контекст Monad m. Списки и тип Maybe являются монадами. Мы можем уточнить, что return True означает для них:
Prelude> return True :: [Bool]
[True]
Prelude> return True :: [] Bool
[True]
Prelude> return True :: Maybe Bool
Just True
Наличие оператора return позволяет превратить любую функцию из a -> b в стрелку Клейсли, т.е. в вычисление которое возвращает нам значение упакованное в контейнер.
Можно упростить и сказать, что toKleisli это функция двух аргументов:
Пример использования стрелки Клейсли: