(->)
часто называют «стрелкой функции» или «конструктором типа функции», и хотя он имеет некоторый специальный синтаксис, не так уж особен для .
По сути это оператор инфиксного типа.Дайте ему два типа, и он даст вам тип функций между этими типами.Так же, как 2 + 3
является синтаксическим сахаром для (+) 2 3
, так и from -> to
синтаксический сахар для (->) from to
.Вы можете думать об этом как Function from to
, если символы сбивают с толку.
Другими словами, упомянутый вами пример можно прочитать как
instance Monad (Function from) where ...
, что дает понять, что мыговорить о функциях, которые принимают аргументы произвольного (но фиксированного) типа.Фактически, этот экземпляр монады находится в Control.Monad.Instances , и он по сути такой же, как Монада Reader .
Глядя на источник, это действительно довольно просто:
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
Тривиальные значения, заданные return
, игнорируют аргумент, а оператор (>>=)
распределяет аргумент r
по обеим сторонам.
Интересно также отметить, что в соответствующем экземпляре Applicative
для функций pure
и (<*>)
соответствуют комбинаторам K и S исчисления комбинатора SKI .
(->)
также обобщается на класс типа стрелки .Введение в стрелки можно найти здесь .
Наконец, обратите внимание, что символ ->
также появляется в других более или менее не связанных частях синтаксиса, включая лямбда-абстракции \x -> ...
,выражения case ... of x -> ...
и т. д. Обратный символ <-
также встречается в нескольких не связанных контекстах.Не путайте их со стрелкой функции.