以下代码段编译:
{-# 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 \\
设置运算符的优先级,但这不能解决问题,表明~
的优先级为at least 9(如果我正确地解释了这一点。我尝试使用this answer中的技巧让GHCi告诉我~
的优先级,但它不起作用。
从技术上讲,~
可能不是一个类型操作符,它更像是一个类似于,
的词法结构,但问题仍然存在:
~
绑得这么紧?(注意:This question询问类型函数的优先级,但它没有提及~
的任何内容。)
答案 0 :(得分:1)
~
不是运营商,它是关键字,如module
或case
,因此我认为您只能使用括号更改优先级。
在此处查看更多内容:https://wiki.haskell.org/Keywords#.7E