Я пытаюсь проверить что-то для себя о приоритете оператора и функции в Haskell. Например, следующий кодОператор Haskell против приоритета функции
list = map foo $ xs
можно переписать в виде
list = (map foo) $ (xs)
и в конечном итоге будет
list = map foo xs
Мой вопрос раньше, почему первая формулировка не будет переписать в виде
list = (map foo $) xs
, поскольку приоритет функции всегда выше приоритета оператора, но я думаю, что нашел ответ: операторам просто не разрешено быть аргументами функций (за исключением, конечно, если вы окружите их круглыми скобками). Это правильно? Если это так, мне показалось странным, что в RWH не упоминается об этом механизме/правилах или не узнаете вас в Haskell или в любом другом месте, которое я искал. Поэтому, если вы знаете место, где указано правило, обратитесь к нему.
- изменить: Спасибо за ваши быстрые ответы. Я думаю, что моя путаница возникла из-за того, что оператор-литерал каким-то образом оценит что-то, что может быть использовано функцией в качестве аргумента. Это помогло мне вспомнить, что оператор инфикса можно механически перевести на префиксные функции. Делая это первая формулировка урожайности
($) (map foo) (xs)
, где нет никаких сомнений в том, что ($) есть функция потребления, и так как обе формулировки эквивалентны, то $ буквальным в первой формулировке не может потребляться по карте.
спасибо. После прочтения вашего ответа, когда вы говорите, что мой вопрос немного смущен, я беру его, чтобы понять, что мое упоминание о «приоритете функции» неверно, и что функции сами по себе не имеют никакого приоритета, а скорее могут рассматриваться как аргументы оператору приложения, пробелы. Это верно? Я до сих пор не совсем понимаю, как инфиксные операторы вписываются в это. Я отредактировал свой вопрос, чтобы подумать, как я могу лучше подумать об этом. Правильно ли это понимание? – Boris
Нет, не совсем. Функции и операторы неразличимы в Haskell. Они могут иметь разные уровни приоритета, указанные пользователем. –
Хорошо. Я все еще пытаюсь выяснить общее правило, которое приводит к списку = (map foo) $ (xs) вместо list = (map foo $) xs - что я знаю - это раздел. Можно ли сказать, что при принятии решения, для данного выражения, какие аргументы принадлежат тем функциям и операторам, функции потребляют - начиная с левой стороны - все аргументы, которые они могут, до тех пор, пока они не достигнут оператора.После этого операторы используют свои аргументы в соответствии с их приоритетом и ассоциативностью (это немного расплывчато, но, надеюсь, вы понимаете). Извините, если это кажется очевидным, но мне это никогда не было ясно. – Boris