Приоритет приложения инфиксной функции Haskell

Пусть f x y = x * y. Мы можем применить эту функцию двумя способами: f 5 6 или, используя инфиксную нотацию, 5 `f` 6. Применяются ли операторные правила к этому последнему выражению? Какой приоритет будет у этого приложения? Является ли это просто другой формой приложения функции, и поэтому она также будет иметь наивысший приоритет?

Я предполагаю, что компилятор видит эту особую форму (из-за `` и/или имени, начинающегося с буквы (?)), и на самом деле обрабатывает это как обычное приложение функции, вместо того, чтобы считать его оператором.


person demi    schedule 15.11.2011    source источник
comment
Синтаксис Haskell 98 позволяет выбрать уровень приоритета, см. haskell.org/onlinereport/decls. html#fixity для получения подробной информации.   -  person Chris Kuklewicz    schedule 15.11.2011


Ответы (2)


В отчете Haskell 98 есть раздел Приложения оператора, которые проясняют ситуацию:

Оператор — это либо символ оператора, такой как + или $$, либо обычный идентификатор, заключенный в вертикальные кавычки (обратные кавычки), например `op`. Например, вместо префикса application op x y можно написать инфикс application x `op` y. Если для `op` не задано объявление фиксации, то по умолчанию используется наивысший приоритет и левая ассоциативность (см. Раздел 4.4.2).

Как указано в других ответах, в отчете также есть раздел, посвященный объявлениям Fixity, позволяет вам определить свою собственную фиксацию, например:

infixl 7 `op`
person Nicolas Wu    schedule 15.11.2011

Если не указано явное объявление фиксации, например.

infixl 7 `quot`

инфиксная функция с обратной галочкой имеет фиксированность по умолчанию infixl 9, поэтому будет обрабатываться как любой другой инфиксный оператор с той же фиксированностью.

person Daniel Fischer    schedule 15.11.2011
comment
Почему по умолчанию используется infixl 9? Есть ли какая-то причина за этим выбором, или он произволен? - person CMCDragonkai; 31.03.2015
comment
В каком-то смысле это, конечно, произвольно. Но поскольку наличие infix не позволяет цепочку без круглых скобок, удобнее иметь направление ассоциативности. Правоассоциативность встречается реже, поэтому infixl — наименее неожиданный выбор. Уровень приоритета 9 наиболее близок к приоритету применения префикса, следовательно, он меньше всего меняется по сравнению с применением префикса. Меня не было, когда это решалось, но я думаю, что идея в том, что infixl 9 был выбран с расчетом на то, что он наиболее удобен и вызывает наименьшее удивление. - person Daniel Fischer; 31.03.2015
comment
Понятно, а как насчет таких вещей, как !! и $. Есть ли какая-либо причина, по которой !! имеет более высокий приоритет, чем $? Просто пытаюсь понять причины всех размещений операторов в таблице: haskell.org /onlinereport/decls.html#fixity - person CMCDragonkai; 01.04.2015
comment
$ требует очень низкого приоритета, потому что в противном случае вам все равно понадобятся круглые скобки при применении функции к неатомарному аргументу, foo $ a + b*c было бы довольно бессмысленно, если бы оно означало (foo a) + (b*c). Цель $ требует, чтобы практически все остальное имело более высокий приоритет. Многие [относительные] приоритеты, * связаны сильнее, чем + и т. д., распространены в математике, а также в других языках программирования. Помимо предшествующих соглашений, соображения, которые были бы наиболее удобными для [ожидаемых] общих случаев, сыграли роль в определении приоритетов. - person Daniel Fischer; 01.04.2015