我还是不明白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/