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