gpt4 book ai didi

haskell - 了解为什么 a/b 不起作用,但 fromInteger a/fromInteger b 起作用

转载 作者:行者123 更新时间:2023-12-02 02:50:45 30 4
gpt4 key购买 nike

在 Haskell 中,这有效:

ghci>5/2
2.5

伟大的。但是,如果我将 5 和 2 分配给变量..
Main> let a = 5
Main> let b = 2
Main> a/b
<interactive>:68:2:
No instance for (Fractional Integer)
arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: a / b
In an equation for `it': it = a / b
Main>

我在 wazoo 上遇到错误。我可以绕过它的唯一方法是说:
*Main> fromInteger a / fromInteger b
2.5
*Main>

fromInteger 发生了什么?为什么我需要它来完成这项工作?

最佳答案

这是monomorphism restriction在上类。 a 的类型和 b默认为 Integer ,显然不能与 / 一起使用因为它只适用于 Fractional类型。

您可以通过在定义 a 时添加类型注释来解决此问题。和 b :

> let a = 5 :: Double
> let b = 2 :: Double
> a / b
2.5

或者您可以使用默认为 Double 的十进制文字:
> let a = 5.0
> let b = 2.0
> a / b
2.5

如果这三行一起被类型检查,这不会是一个问题,因为它们将在一个编译模块中,或者如果你已经输入
let a = 5; b = 2 in a / b

但是,当在 GHCi 中单独键入时,它们一次只进行一个类型检查,因此在评估 let a = 5 时应用默认值。精选 Integer因为那时对 a 的唯一约束是 Num .它不知道 Fractional为了使用 / 我们需要的约束以后用它。

关于haskell - 了解为什么 a/b 不起作用,但 fromInteger a/fromInteger b 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16244612/

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