最近当我尝试将* -> * -> *
具有一个绑定类型var的构造函数传递给期望* -> *
构造函数的构造函数时,我措手不及。具体来说,它是沿着将(x -> (x, 42)) :: (forall a. a -> (a, Int))
传递给类型forall c. (forall a. a -> c a) -> ...
的函数的路线。这是模棱两可的,但不是 GHC 中的错误:(,)
转换为* -> *
可以解释为左侧或右侧参数的构造函数,而 GHC 似乎只是默认为右侧参数。对于更高种类的匹配,它将需要正确的大多数参数。要看到这一点,只需测试推断的类型:
foo :: c a b -> a -> b -> ()
foo _ _ _ = ()
bar = foo ((), 42, 'a') 42 'a' -- typechecks
相反,我错误地认为它会按顺序匹配自由变量,但这种更高等级的情况是唯一明显首选的情况,而其他时候则是洗涤。是否有描述此规则的官方文档?我有点恼火,但也理解这不是一个错误的事实,因为我可以预见这样可以节省在 newtype 中包装很多东西。
除非我误解了这个问题,否则这只是因为类型应用程序是左关联的,就像函数应用程序一样。
(a, b)
是(,) a b
是((,) a) b
.所以(Int, a)
((,) Int) a
,但(a, Int)
不是<something> a
。