我遇到了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

07-24 09:53
查看更多