Следующий фрагмент компиляции:
{-# 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 демонстрируют различное поведение?
- Почему
~
связывается так плотно? - Есть ли что-то, что я могу сделать, чтобы заставить мои собственные операторы связываться еще сильнее?
(Примечание: Этот вопрос задает вопрос о приоритете функций типа, но он ничего не говорит о ~
.)