Eya*_*yal 4 haskell types ghci
当我使用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
Run Code Online (Sandbox Code Playgroud)
为什么我设置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)添加类型签名或禁用单态限制来解决此问题.