我遇到了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生成的代码,我不想手动修改任何内容。
happyMonad2Reduce
生成的代码,如果没有使用-a
选项生成,则会出现nt :: Int#
变量的问题(因为它在没有-a
的情况下不被使用,所以会出现类型推断问题)。我目前正在解决一些更严重的 Happy 问题,所以将 此 问题提交给问题列表放在了后面。 :) - Alecf
函数的类型都不能是多种类型(具体来说,是levity-polymorphic类型)。变量x
的类型属于levity-polymorphic类型,而且没有任何变量可以拥有这样的类型。因此,你需要GHC推断出单态化类型。我的猜测是,尽管类型检查器可以将类多态代码延迟应用到单态化限制上,但它没有机制来对基本的levity-polymorphic代码这样做。 - dfeuer