gpt4 book ai didi

haskell - Haskell 中的除法,还是没明白

转载 作者:行者123 更新时间:2023-12-02 18:23:43 24 4
gpt4 key购买 nike

我还是不明白Haskell中的除法。我的第一个意图是定义一个像这样的函数:

piApprox :: (Integral a, Fractional b) => a -> b
piApprox n = 4 * sum [ (-1)^k / (2*k + 1) | k <- [0..n] ]

这不起作用。然后,使用签名:

piApprox :: (Fractional a) => Int -> a

但它再次引发“无法推断”错误。

如果我在解释器中运行此代码来找出最好的签名,结果是:

Prelude> let piApprox n = 4 * sum [ (-1)^k / (2*k + 1) | k <- [0..n] ]
Prelude> :t piApprox
piApprox :: (Fractional a, Integral a) => a -> a

这会引发“类型变量‘a0’不明确”错误。

现在,我能想到的进行此计算的唯一方法是包括 Ratio打包然后转换为double通过使用fromRational .

import Data.Ratio
piApprox n = (fromRational) $ 4 * sum [ (-1)^k % (2*k + 1) | k <- [0..n] ]

它有效,但我认为这不是最好的方法。

我还以为签名中的输入输出类型都是正确的,中间操作(-1)^k / (2*k + 1) -- 划分的位置 -- 可能是问题所在,所以我还定义了:

piApprox' :: (Fractional a) => Int -> a
piApprox' n = 4 * sum [ (fromIntegral) $ (-1)^k / (2*k + 1) | k <- [0..n] ]

没有运气。我在这里缺少什么?

最佳答案

这应该有效:

piApprox n = 4 * sum [ fromIntegral ((-1)^k) / fromIntegral (2*k + 1) | k <- [0..n] ]

fromIntegral 函数的类型签名为:

(积分 a,数字 b)=> a -> b

所以它基本上将您的 Integral 类型转换为 Num 类型。

(/) 的类型是:

Fractional a => a -> a -> a,因此您必须向其提供小数数据。

fromIntegral 函数将通过将其转换为包含 Fractional 类型的 Num 类型来准确实现此目的。

关于haskell - Haskell 中的除法,还是没明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20923474/

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