Haskell 被大整数除时的精度

Haskell 被大整数除时的精度,haskell,Haskell,我试图编写一个函数,在给定一个整数'x的情况下计算ex(前10项) ex的级数展开式如下所示: 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 _e

我试图编写一个函数,在给定一个整数'x的情况下计算ex(前10项)

ex的级数展开式如下所示:

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^n
factorial n
),然后在浮点上下文中使用
fromIntegral
/
计算它们。但是,此函数返回以下错误:

    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'
我正在使用以下主要功能运行该功能:

main = do
   n <- readLn :: IO Int -- n doesnt really matter here because of getContents
   inputdata <- getContents
   mapM_ putStrLn $ map show $ f $ map (read :: String -> Double) $ lines inputdata
main=do

这是你可能要找的东西

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)
(^^)::(分数a,积分b)=>a->b->a

您不希望
n
x
相同。看看这个幂函数是怎么做到的


哦,你的方程对
n=1
是错误的,你应该有
1+x

这是你可能要找的

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)
(^^)::(分数a,积分b)=>a->b->a

您不希望
n
x
相同。看看这个幂函数是怎么做到的

哦,你的方程对
n=1
是错误的,你应该有
1+x

这种类型:

_eToX :: (Fractional a, Integral a) => a -> a -> a
没有道理。您希望第一个参数和结果为
分数
,但与序列位置相对应的第二个参数应为
整数
。将类型更改为:

_eToX :: (Fractional a, Integral b) => a -> b -> a
现在有一个不同的错误,它是由于
fromIntegral(x^n)
而导致缺少
Integral
实例而产生的。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)
这种类型:

_eToX :: (Fractional a, Integral a) => a -> a -> a
没有道理。您希望第一个参数和结果为
分数
,但与序列位置相对应的第二个参数应为
整数
。将类型更改为:

_eToX :: (Fractional a, Integral b) => a -> b -> a
现在有一个不同的错误,它是由于
fromIntegral(x^n)
而导致缺少
Integral
实例而产生的。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)

您的
f
是否为给定的
\u eToX
?您的_-eToX接受两个参数,但您只对一个参数应用f。 只要您只需要部分应用程序,这就可以了

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

您的阶乘的类型是什么?它似乎是一个整数,而不是实现类型类
Integral
fractal


您为read函数s.t.添加了一个类型注释。它返回一个
Double
,它不是
Integral
的实例。但是你的
f
似乎把某个东西作为一个参数,它是
Integral
的一个实例你的
f
是给定的
\u eToX
?您的_-eToX接受两个参数,但您只对一个参数应用f。 只要您只需要部分应用程序,这就可以了

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

您的阶乘的类型是什么?它似乎是一个整数,而不是实现类型类
Integral
fractal


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

的一个实例,你可以使用
Rational
然后你不需要from Integral,你可以使用
Rational
然后你不需要from Integral谢谢你的回答,Haskell与大多数函数式语言非常不同,因此我在类型类方面遇到了一些问题。我似乎仍然得到一个关于阶乘调用的错误;但我会自己解决的,可能和你的阶乘定义有关。我使用的是
factorial n=product[1..n]
,这需要一个额外的
Enum
约束,但很简单。我的定义是
factorial::Integer->Integer
factorial n=product[1..n]
我考虑了你所说的Enum约束,并得出了以下结论:
factorial:(Enum a,Num a)=>a->a
似乎正确地进行了打字检查。谢谢。@HunterMcMillen:这很有道理。原始的
factorial
将输入限制为
Integer
,其中在
\u eToX
中,它在类型
Integral b=>b
处调用。如果您将
\u eToX
类型中的
b
类型参数更改为
Integer
,这将起作用。感谢您的回复,Haskell与大多数函数式语言非常不同,因此我在类型类方面遇到了一些问题。我似乎仍然得到一个关于阶乘调用的错误;但我会自己解决的,可能和你的阶乘定义有关。我使用的是
factorial n=product[1..n]
,这需要一个额外的
Enum
约束,但很简单。我的定义是
factorial::Integer->Integer
factorial n=product[1..n]
我考虑了你所说的Enum约束,并得出了以下结论:
factorial:(Enum a,Num a)=>a->a
似乎正确地进行了打字检查。谢谢。@HunterMcMillen:这很有道理。原始的
factorial
将输入限制为
Integer
,其中在
\u eToX
中,它在类型
Integral b=>b
处调用。如果您将类型中的
b
type参数更改为
Integer
,则这将起作用