与 GHCi 中 fromIntegral 的行为不一致

2024-04-01

我希望有人能够解释 GHCi 中使用 fromIntegral 函数时的以下行为:

Prelude> let x = 1 :: Integer                                                                                                                                                    
Prelude> :t x                                                                                                                                                                    
x :: Integer                                                                                                                                                                     
Prelude> sqrt $ fromIntegral x                                                                                                                                                   
1.0                                                                                                                                                                              
Prelude> let y = fromIntegral x                                                                                                                                                  
Prelude> sqrt y                                                                                                                                                                  

<interactive>:181:1:                                                                                                                                                             
No instance for (Floating Integer)                                                                                                                                           
  arising from a use of `sqrt'                                                                                                                                               
Possible fix: add an instance declaration for (Floating Integer)                                                                                                             
In the expression: sqrt y                                                                                                                                                    
In an equation for `it': it = sqrt y                                                                                                                                         

为什么我是否设置很重要y然后取其sqrt或者直接采取sqrt?


fromIntegral它的返回类型是多态的。所以类型y在你的代码中预计是Num a => a。这种类型将允许您使用y作为论据sqrt没有问题。

然而,由于单态性的限制,y不允许是多态的。因此默认为默认的Num类型,即Integer.

当你这样做时sqrt $ fromIntegral x单态限制不适用,因为它仅适用于全局变量,并且您不存储以下结果fromIntegral这次在一个变量中。

您可以通过向 y 添加类型签名来解决此问题(let y :: Num a => a; y = fromIntegal x)或通过禁用单态限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 GHCi 中 fromIntegral 的行为不一致 的相关文章

随机推荐