无法在Haskell中获得正弦函数的近似值

时间:2014-11-28 05:46:10

标签: haskell

我已经尝试过每一个我能想到的方式,而且我的智慧结束了。我正在尝试在Haskell中编写正弦近似。我认为我遇到的问题与类型声明有关,但我不确定。

这是我的代码:

factorial 0 = 1
factorial n = n * factorial (n-1)

summation' f x 1 = f (x 1)
summation' f x n = f (x n) + f (x n-1)

sineX x i = (((-1)^i)/factorial(2*i+1))*(x^(2*i+1))

sineXApprox x n = summation' sineX x n

如您所见,我已将该功能拆分为三个子功能。

这是我在尝试将“sineXApprox 2 2”输入ghci时遇到的错误(顺便说一下,我在命令提示符下使用ghci):

<interactive>:503:1:
    Could not deduce (Num (a0 -> a1))
      arising from the ambiguity check for `it'
    from the context (Num (a1 -> a1),
                      Num (a -> a1),
                      Num a,
                      Integral a1,
                      Fractional a1,
                      Eq a)
      bound by the inferred type for `it':
                 (Num (a1 -> a1), Num (a -> a1), Num a, Integral a1, Fractional a1,
                  Eq a) =>
                 a1 -> a1
      at <interactive>:503:1-8
    The type variable `a0' is ambiguous
    When checking that `it'
      has the inferred type `forall a a1.
                             (Num (a1 -> a1), Num (a -> a1), Num a, Integral a1, Fractional a1,
                              Eq a) =>
                             a1 -> a1'
    Probable cause: the inferred type is ambiguous

您可以提供的任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:6)

简而言之:你的括号错了。尝试

summation' f x 1 = f x 1
summation' f x n = f x n + f x (n-1)

是的,它与类型声明有关 - 而不是它们的缺失。 在f (x 1)中,Haskell将x解释为函数,这肯定不是什么意思。添加

summation' :: (Double -> Double -> Double) -> Double -> Double -> Double

在第一步中查看错误消息的更改方式。还为所有其他功能添加类型签名。

Haskell的类型检查功能非常强大,它的缺点是,当你写一些你并不意味着的东西时,它仍然试图从中获得一些意义。错误消息被移除。使用显式类型签名,您可以更轻松地找到问题。

实际上,其中一些参数应该是Int而不是Doubles,但这会打开另一种蠕虫......