GHC无法推断未提升的类型

问题描述:

我正在运行,看起来像由Happy生成的无效代码。问题归结为GHC不推断函数的polykinded类型签名。这里有这样一个例子: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生成的代码,我不希望手动修改任何内容。

+0

这似乎相关:https://stackoverflow.com/a/35320729/180286。基本上一个函数不能是多种类型的,除非你真的想要,只有在GHC 8+ –

+2

如果Happy生成的代码不能以这种方式编译,那么它可能是Happy中的一个错误(也许可能是一个错误解决了!)。你能组合一个生成这样的代码的简单快乐例子吗?我不认为GHC会推断出多种类型的“*”以外的其他类型。 – user2407038

+0

@ user2407038虽然我的问题仍然存在,但这个特定的Happy错误很容易修复。基本上,任何生成的使用'happyMonad2Reduce'并且不是使用'-a'生成的代码对于'nt :: Int#'变量都会产生这个问题(不使用'-a',因此类型推断问题)。我现在正在打击一些更糟糕的快乐问题,因此为_this_提出问题正在背后。 :) – Alec

正如@dfeuer暗示的,这是不可能的。在最糟糕的情况下,GHC将不得不在整个项目中寻找给定函数的用法,以推断论证的灵活性。

这被报告为bug in Happy并从那以后被fixed