哪个 GHC/Haskell 规范说自由类型构造函数与最右边的类型匹配?



最近当我尝试将* -> * -> *具有一个绑定类型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

相关内容

  • 没有找到相关文章

最新更新