相关疑难解决方法(0)

为什么即使禁用MonomorphismRestriction,GHC仍会在此处推断单态类型?

解决“ f = f(<*>)pure”类型提示了这一点,该类型讨论了一个更复杂的示例,但该示例也有效。

以下定义可以毫无问题地进行编译:

w :: Integral a => a
w = fromInteger w
Run Code Online (Sandbox Code Playgroud)

...当然,它在运行时无法正常工作,但这是个问题。问题的关键是,定义w本身使用的专用版本w :: Integer。显然,这一个合适的实例,因此进行类型检查。

但是,如果我们删除签名,那么GHC不会推断上述类型,而只能推断具体类型:

w' = fromInteger w'
Run Code Online (Sandbox Code Playgroud)
GHCi> :t w
w :: Integral a => a
GHCi> :t w'
w' :: Integer
Run Code Online (Sandbox Code Playgroud)

好吧,当我看到这一点时,我相当确定这是工作中的单态性限制。众所周知,例如

i = 3
Run Code Online (Sandbox Code Playgroud)
GHCi> :t i
i :: Integer
Run Code Online (Sandbox Code Playgroud)

虽然i :: Num p => p完全有可能。实际上,i :: Num p => p 可以推断出是否-XNoMonomorphismRestriction处于活动状态,即是否禁用了单态性限制。

但是,即使禁用了单态性限制, …

recursion haskell type-inference parametric-polymorphism

16
推荐指数
1
解决办法
341
查看次数