2013-10-07 41 views
1

我想写一个函数,计算电子x(前10项)给出一个整数`x。精度除以大整数

的级数为电子X

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

给出的函数本身是相当容易写,但我似乎无法理解师哈斯克尔类型的规则,也就是我想要分割通过一个更大的整数一个整数,并得到一个浮点结果:

这里是我有那么目前

_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. 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 
+0

您可以使用'Rational',那么您不需要从整合 – DiegoNolan

回答

4

此类型:

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

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

_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) 
+0

感谢您的回应,Haskell非常不同于大多数函数式语言,因此我在Typeclasses中遇到了一些麻烦。我似乎仍然收到与阶乘呼叫相关的错误;但我会自己完成。 –

+0

它可能与您的阶乘定义有关。我正在使用'factorial n = product [1..n]',这需要额外的'Enum'约束,但很容易。 –

+0

我的定义是'factorial :: Integer-> Integer','factorial n = product [1..n]' –

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

0

是您f给定_eToX?你的_eToX需要两个参数,但是你只将f应用到一个参数。 只要您只需要部分应用程序就可以了。

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

这是什么似乎是实现Typclasses Integralfractional

的东西,有一个整数作为一个结果,而不是你的阶乘的类型

您为读取函数添加了一个类型注释,st它返回一个Double这不是Integral的一个实例。但你的f似乎需要一些作为Integral的实例的论点。