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