我已经尝试过每一个我能想到的方式,而且我的智慧结束了。我正在尝试在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
您可以提供的任何帮助表示赞赏!
答案 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
,但这会打开另一种蠕虫......