Где я могу прочитать об операторе haskell "->"? - PullRequest
30 голосов
/ 04 февраля 2012

Я хотел бы узнать больше об операторе haskell ->. Я не совсем понимаю, насколько сильно стирается грань между специальным синтаксисом и чем-то вроде класса типов, и я хотел бы немного поэкспериментировать. В частности, я видел такие вещи:

instance Monad ((->) r) where ...

Это пробудило мой интерес.

Однако, когда я пытаюсь найти «стрелку haskell» или «функцию haskell» или «функцию класса haskell», я сталкиваюсь с очевидными проблемами получения результатов для Control.Arrow или учебных пособий по классам простого типа.

Как называется -> и где я могу прочитать об этом подробнее?

Ответы [ 2 ]

37 голосов
/ 04 февраля 2012

(->) часто называют «стрелкой функции» или «конструктором типа функции», и хотя он имеет некоторый специальный синтаксис, не так уж особен для .

По сути это оператор инфиксного типа.Дайте ему два типа, и он даст вам тип функций между этими типами.Так же, как 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 -> ... и т. д. Обратный символ <- также встречается в нескольких не связанных контекстах.Не путайте их со стрелкой функции.

0 голосов
/ 04 февраля 2012

Я думаю, что называется стрелкой. Согласно " Real World Haskell ":

-> имеет только одно значение: оно обозначает функцию, которая принимает аргумент типа слева и возвращает значение типа справа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...