我希望有人可以在使用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为何如此重要?

最佳答案

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

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

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

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

09-25 20:27