1

我正在尝试编写一个函数,在给定整数 ` 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^nand factorial n) 然后在浮点上下文中使用fromIntegraland评估它们/。但是,此函数返回此错误:

    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
4

3 回答 3

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)
于 2013-10-07T21:45:49.257 回答
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

于 2013-10-07T21:45:12.613 回答
0

f是给定的_eToX吗?您的 _eToX 接受两个参数,但您仅将 f 应用于一个。只要您只想要一个部分应用程序就可以了。

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

您的阶乘的类型是什么,它似乎是具有 Integer 结果的东西,而不是实现 TypclassesIntegralfractional

您为 read 函数添加了类型注释,它返回一个Double不是Integral. 但是您f似乎将某些东西作为论点,它是Integral.

于 2013-10-07T21:46:26.590 回答