Каков приоритет `->`, `=` и `` в Haskell? - PullRequest
5 голосов
/ 19 мая 2019

Я пытаюсь выяснить некоторые приоритеты операторов по умолчанию в Haskell, но мне не удалось найти хорошую документацию по ->, = и (как в f x). Поэтому я попытался :i (->) и :i (=) в GHCI, чтобы получить некоторую информацию, но это дает мне синтаксическую ошибку.

Очевидно, что эти "токены" являются просто встроенной частью синтаксиса, поэтому неудивительно, что :i не работает.

Я новичок в Haskell, поэтому я не знал о том факте, что = не возвращает никакого значения, я просто ошибочно предположил, что он ведет себя как эквивалент в императивных языках, что неправильно Конечно.

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

1 Ответ

9 голосов
/ 19 мая 2019
  • -> является оператором уровня типа ((->) :: * -> * -> *), и, как упоминается в комментариях, :i (->) показывает, что это infixr 0*.
  • Применение функции можно рассматривать как имеющее «бесконечно высокий» левый приоритет, то есть если % является каким-либо оператором, тогда f x % y всегда будет читаться как (f x) % y независимо от того, какой приоритет имеет %, и f x y z всегда читается как ((f x) y) z. ** Это не задокументировано как имеющее приоритет, потому что это не оператор, и «бесконечный» приоритет не может быть объявлен в Haskell.
  • = нельзя рассматривать как имеющий приоритет, поскольку это всегда объявление , а не выражение , поэтому ставить круглые скобки вокруг него - абсурд. Это не оператор, следовательно, не может иметь приоритета.

* Как указано в комментарии ниже, это на самом деле ведет себя так, как если бы оно имело приоритет infixr -1, но это не разрешено в обычных операторах - это скорее синтаксический, чем семантический.

** Обратите внимание, что это «противоположность» ->, которая может рассматриваться как имеющая «бесконечно низкий», правый приоритет. Вы понимаете, почему это естественно?

...