我正在尝试编写一个函数来计算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^n
和factorial 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'
答案 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
您不希望n
和x
相同。看看它的功能如何。
哦,n = 1
你应该有1 + x
答案 2 :(得分:0)
您的f
是否为_eToX
?你的_eToX有两个参数但你只将f应用于一个。
只要你只想要一个部分应用程序就可以了。
关于错误消息,您应该检查以下内容:
您的阶乘的类型是什么,它似乎是一个结果有Integer而不是实现Typclasses Integral
和fractional
您为读取功能添加了类型注释,s.t。它返回Double
这不是Integral
的实例。但是你的f
似乎把某些东西作为一个参数,它是Integral
的一个实例。