Почему приоритет Haskell имеет только 10 уровней? Достаточно ли цифра 10?

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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