解决“ f = f(<*>)pure”类型提示了这一点,该类型讨论了一个更复杂的示例,但该示例也有效。
以下定义可以毫无问题地进行编译:
w :: Integral a => a
w = fromInteger w
...当然,它在运行时无法正常工作,但这是个问题。问题的关键是,定义w本身使用的专用版本的w :: Integer。显然,这是一个合适的实例,因此进行类型检查。
但是,如果我们删除签名,那么GHC不会推断上述类型,而只能推断具体类型:
w' = fromInteger w'
GHCi> :t w
w :: Integral a => a
GHCi> :t w'
w' :: Integer
好吧,当我看到这一点时,我相当确定这是工作中的单态性限制。众所周知,例如
i = 3
GHCi> :t i
i :: Integer
虽然i :: Num p => p完全有可能。实际上,i :: Num p => p 可以推断出是否-XNoMonomorphismRestriction处于活动状态,即是否禁用了单态性限制。
但是,即使禁用了单态性限制, …