我遇到了看起来像是 Happy 生成的无效代码。问题归结为GHC没有推断函数的多种类类型签名。下面是一个示例:
{-# Language MagicHash #-}
f x = ()
main = pure (f 1#)
由于 GHC 推断f :: a -> ()
a :: *
的位置,因此失败
• Couldn't match a lifted type with an unlifted type
When matching the kind of ‘GHC.Prim.Int#’
• In the first argument of ‘f’, namely ‘1#’
In the first argument of ‘pure’, namely ‘(f 1#)’
In the expression: pure (f 1#)
是否有任何语言编译指示我可以打开来编译此代码?我知道理论上我可以只添加类型签名,但由于这是 Happy 生成的代码,我宁愿不必手动修改任何内容。
正如@dfeuer所暗示的,这是不可能的。在最坏的情况下,GHC必须在整个项目中寻找给定函数的用法,以推断参数的轻率。
这被报告为 Happy 中的一个错误,此后已得到修复。