Почему приоритет Хаскелла имеет только 10 уровней?Достаточно ли цифры 10? - PullRequest
11 голосов
/ 12 июня 2011

Я хочу знать, почему дизайнеры Haskell согласились разрешить только 10 уровней приоритета?Кто-нибудь нашел это недостаточно?

Ответы [ 2 ]

20 голосов
/ 12 июня 2011

Насколько мне известно, это совершенно произвольно.Вся документация, о которой я знаю, просто утверждает это как факт, без какой-либо детализации или обоснования.

Но если вы подумаете об этом, почему что-то еще будет лучше?Хорошо, скажем, 10 недостаточно.У вас есть (.), который имеет наивысшую фиксированность, и вы хотите что-то еще, что связывает немного крепче.Вы добавляете дополнительный уровень, так что ваш новый максимум равен 10 (хотя большинство исправлений только 9).

Теперь у вас есть 11 уровней приоритета.( Это смешно. Это даже не смешно. ) Как это менее произвольно, чем 10?Что мешает вам добавить еще?Что если вы хотите новые уровни между существующими?Конечно, вы можете продолжать добавлять больше, пока в конце концов не обнаружите, что пишете infix↑ (ω + 2i) и задаетесь вопросом, где ваша жизнь пошла не так.

Дело в том, что приоритет оператора по своей природе является довольно произвольной вещью.Есть несколько соглашений - мультипликативные вещи связывают более тесно, чем аддитивные, логические операторы имеют меньший приоритет, чем булевозначные функции, такие как (==), - но они несколько ограничены и обычно не охватывают более нескольких уровней.В противном случае, единственный способ запомнить операторские приоритеты - это ... ну, запомните их, как просто запомните каждый из них.Это не только рутинная работа, она может сделать код непрозрачным для тех, кто не может запомнить все также.Человеческая рабочая память является очень ограниченным ресурсом, поэтому чем меньше придирчивых деталей, которые необходимо вспомнить при кодировании, тем лучше.

Большинство применений операторов в Haskell, где приоритет имеет значение, относятся к одной из нескольких грубых групп:

  • Псевдосинтаксические операторы, такие как обычное использование ($), которым обычно требуется чрезвычайно высокий или низкий приоритет, чтобы избежать конфликта с другими операторами.

  • Выражения с использованиемстандартные операторы или их разновидности, где существует несколько стандартных уровней приоритета, и новые операторы должны, как правило, использовать тот же уровень, на котором они основаны.

  • Специализированные наборы операторов, такие какдля EDSL, чьи символы и уровни приоритета обычно выбираются так, чтобы отражать природу EDSL, и вряд ли могут сосуществовать с другими наборами операторов.

Все они отлично справляются только снесколько уровней приоритета.Что еще более важно, они характеризуются тем, что либо эффективно независимы от других операторов, либо используются только вместе с очень ограниченным набором других операторов.Начните добавлять больше операторов и смешивать их вместе в одном выражении, и очень скоро люди все равно начнут использовать явные скобки, потому что они не могут вспомнить, что связывает более тесно, чем что.Говоря сам за себя, я уже склонен к явным скобкам при смешивании операторов в стиле EDSL (скажем, Arrow комбинаторов) с логическими операторами, потому что я обычно не могу вспомнить точные уровни приоритета, которые есть у каждого.

Итак, установив, что: 1) множество дополнительных уровней предшествования не будет столь полезным, потому что его слишком много, чтобы отслеживать, и 2) любой предел, который мы выберембыть одинаково произвольным ... почему 10?Я собираюсь угадать, «потому что тогда значения фиксированности будут только однозначными».

8 голосов
/ 12 июня 2011

Количество уровней является произвольным, и, насколько я помню, решение состояло в том, что множество уровней просто мешают вспомнить, как взаимодействуют операторы.Например, Prolog допускает 1000 уровней, но я никогда не обнаруживал, что это намного лучше, чем у Haskell.

Расширяя уровни предшественников Haskell, вы можете представить себе переход на рациональное число, так что вы всегда можете поместить оператора между двумясуществующий оператор.Но лучшим выбором, вероятно, будет переключение на прецеденты, являющиеся частичным порядком.Таким образом, с учетом двух операторов они могут быть связаны, а затем обработаны соответствующим образом или не связаны, что приведет к скобкам.

...