Подтвердить что ты не робот

В чем преимущество ~ и почему?

Следующий фрагмент компиляции:

{-# LANGUAGE TypeFamilies #-}
type family Foo a b

f :: (Foo a b ~ Int) => a -> b -> b
f = error ""

но операторы типа infix ведут себя по-другому:

{-# LANGUAGE TypeFamilies #-}
type family a \\ b

f :: (a \\ b ~ Int) => a -> b -> b
f = error ""

GHC жалуется, что второй аргумент \\ должен иметь вид *, но b ~ Int имеет вид Constraint. Конечно, это можно исправить с помощью parens, но мне интересно, есть ли другой способ.

Я попытался установить приоритет моего оператора с объявлением о безопасности infixl 9 \\, но это не устраняет проблему, указывая, что приоритет ~ не менее 9 (если я правильно это интерпретирую). Я попытался использовать трюк из этого ответа, чтобы заставить GHCi сказать мне приоритет ~, но это не сработало.

С технической точки зрения, ~, вероятно, не является оператором типа, это скорее лексическая конструкция, аналогичная ,, но все еще остаются вопросы:

  • Почему операторы infix и prefix демонстрируют различное поведение?
  • Почему ~ связывается так плотно?
  • Есть ли что-то, что я могу сделать, чтобы заставить мои собственные операторы связываться еще сильнее?

(Примечание: Этот вопрос задает вопрос о приоритете функций типа, но он ничего не говорит о ~.)

4b9b3361

Ответ 1

~ не является оператором, это ключевое слово, например module или case, поэтому я думаю, что вы можете изменить приоритет только с помощью круглых скобок.

Подробнее здесь: https://wiki.haskell.org/Keywords#.7E