什么 GHC/Haskell 规范说自由类型构造函数匹配最右边的类型?
What GHC/Haskell specification says that free type constructors match rightmost types?
最近当我试图将一种类型 * -> * -> *
的构造函数与一个绑定类型 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
相反,我错误地认为它会按顺序匹配自由变量,但是这种更高级别的情况是唯一一次显然是首选的情况,而其他时候则无济于事。是否有描述此规则的官方文档?我有点恼火,但也明白这不是错误,因为我可以预见这可以节省用新类型包装很多东西。
除非我误解了这个问题,否则这只是因为类型应用程序是左关联的,就像函数应用程序一样。
(a, b)
是 (,) a b
是 ((,) a) b
。所以 (Int, a)
是 ((,) Int) a
,但 (a, Int)
不是 <something> a
。
最近当我试图将一种类型 * -> * -> *
的构造函数与一个绑定类型 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
相反,我错误地认为它会按顺序匹配自由变量,但是这种更高级别的情况是唯一一次显然是首选的情况,而其他时候则无济于事。是否有描述此规则的官方文档?我有点恼火,但也明白这不是错误,因为我可以预见这可以节省用新类型包装很多东西。
除非我误解了这个问题,否则这只是因为类型应用程序是左关联的,就像函数应用程序一样。
(a, b)
是 (,) a b
是 ((,) a) b
。所以 (Int, a)
是 ((,) Int) a
,但 (a, Int)
不是 <something> a
。