gpt4 book ai didi

haskell - 与 GHCi 中 fromIntegral 的行为不一致

转载 作者:行者123 更新时间:2023-12-02 16:48:40 24 4
gpt4 key购买 nike

我希望有人能够解释 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) 或禁用单态限制来解决此问题。

关于haskell - 与 GHCi 中 fromIntegral 的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11439163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com