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