除以大整数时的精度

时间:2013-10-07 21:10:52

标签: haskell

我正在尝试编写一个函数来计算e x (前10个项)给定一个整数`x。

e x 的系列扩展由

给出
1 + x + x2/2! + x3/3! + x4/4! + ....

函数本身相当容易编写,但我似乎无法理解Haskell类型的除法规则,即我想用更大的整数除以整数并获得浮点结果:

这是我目前所拥有的

_eToX :: (Fractional a, Integral a) => a -> a -> a
_eToX x 0 = 1.0
_eToX x 1 = x
_eToX x n = ( fromIntegral(x^n) / fromIntegral(factorial n) ) + _eToX x (n - 1)

我在上面所做的事情对我有意义,计算两个整数结果(x^nfactorial n)然后使用fromIntegral和{{1}在浮点上下文中评估它们}。但是,此函数会返回此错误:

/

我正在使用此主函数运行该函数:

    1. Could not deduce (a ~ Integer)
    from the context (Fractional a, Integral a)
      bound by the type signature for
                 _eToX :: (Fractional a, Integral a) => a -> a -> a
      at /run-r4AWbVU9Fyph0OVhK3Dm/solution.hs:9:10-50
      `a' is a rigid type variable bound by
          the type signature for
            _eToX :: (Fractional a, Integral a) => a -> a -> a
          at /run-r4AWbVU9Fyph0OVhK3Dm/solution.hs:9:10
    In the return type of a call of `factorial'
    In the second argument of `(/)', namely `factorial n'
    In the first argument of `(+)', namely `(x ^ n / factorial n)'

    2. No instance for (Integral Double) arising from a use of `f'
    Possible fix: add an instance declaration for (Integral Double)
    In the expression: f
    In the second argument of `($)', namely
      `f $ map (read :: String -> Double) $ lines inputdata'
    In the second argument of `($)', namely
      `map show $ f $ map (read :: String -> Double) $ lines inputdata'

3 个答案:

答案 0 :(得分:4)

此类型:

_eToX :: (Fractional a, Integral a) => a -> a -> a

没有意义。您希望第一个参数和结果为Fractional,但对应于序列位置的第二个参数应为Integral。将类型更改为:

_eToX :: (Fractional a, Integral b) => a -> b -> a

现在由于Integral因缺少fromIntegral (x^n)实例而出现了不同的错误。 ghci显示

Prelude> :t (^)
(^) :: (Integral b, Num a) => a -> b -> a

所以这里没有必要使用fromIntegral,因为输出已经是正确的类型。最后的功能是:

_eToX :: (Fractional a, Integral b) => a -> b -> a
_eToX x 0 = 1.0
_eToX x 1 = x
_eToX x n = ( (x^n) / fromIntegral(factorial n) ) + _eToX x (n - 1)

答案 1 :(得分:0)

以下是您可能正在寻找的内容。

eToX :: Integral a => Double -> a -> Double
eToX x 0 = 1
eToX x 1 = 1 + x
eToX x n = x^^n / (fromIntegral $ factorial n) + eToX x ( n - 1)

(^^) :: (Fractional a, Integral b) => a -> b -> a

您不希望nx相同。看看它的功能如何。

哦,n = 1你应该有1 + x

的方程式错误

答案 2 :(得分:0)

您的f是否为_eToX?你的_eToX有两个参数但你只将f应用于一个。 只要你只想要一个部分应用程序就可以了。

关于错误消息,您应该检查以下内容:

您的阶乘的类型是什么,它似乎是一个结果有Integer而不是实现Typclasses Integralfractional

的东西

您为读取功能添加了类型注释,s.t。它返回Double这不是Integral的实例。但是你的f似乎把某些东西作为一个参数,它是Integral的一个实例。