Подтвердить что ты не робот

Где я могу прочитать оператор haskell "->"?

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

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

Это вызвало мой интерес.

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

Что называется -> и где я могу узнать больше об этом?

4b9b3361

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

Ответ 2

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

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