我遇到了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必须在整个项目中寻找给定函数的用法,以便推断出参数的重要性。
据报道这是bug in Happy,此后一直是fixed。