4

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

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

4

1 回答 1

9

fromIntegral它的返回类型是多态的。因此y,您的代码中的类型可能是Num a => a. 这种类型将允许您毫无问题地y用作参数。sqrt

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

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

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

于 2012-07-11T18:43:35.563 回答