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

标签 haskell types integer int division

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

相关文章:

java - Scanner.next...对于 Float 抛出 java.util.InputMismatchException,但对于 Int 则不抛出 java.util.InputMismatchException

list - Haskell : Map and Zip A List

windows - Windows 7 上的 Cabal 测试

c - 预期为 ‘struct matrix_t *’ 但参数的类型为 ‘struct matrix_t *’ ?_?没有不同

c# - ForEach 在运行时给出无效的转换

Java ASCII 控制码到文字值

haskell - 如何在Haskell中编写参数和结果都是多态的函数

haskell - 为什么没有办法在 Haskell 中推导出 Applicative Functor?

types - 如何获取声明为接口(interface)类型的对象的类信息

java - 如何对数组列表的所有元素求和