我试图写一个递归计算泰勒的函数:
mcloren x = log (1+x)/(1-x)
compareWithDelta' :: (Num a, Floating a, Integral a, Ord a) => a -> a -> Bool
compareWithDelta' x acc = abs (acc - mcloren x) < 1.0e-10
mcl :: (Floating a, Integral a, Num a) => a -> a
mcl x =
let
mcl' x acc y
| compareWithDelta' x acc = acc
| otherwise = mcl' x (2*(x^(2*y+1)/(2*y+1))) (y+1)
in
mcl' x 0 0
但我有这些错误消息:
No instance for (Num a0) arising from a use of 'mcl'
The type variable 'a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Num Double — Defined in 'GHC.Float'
instance Num Float — Defined in 'GHC.Float'
instance Integral a => Num (GHC.Real.Ratio a)
— Defined in 'GHC.Real'
...plus three others
In the expression: mcl 1
In an equation for 'it': it = mcl 1
它是什么意思以及如何解决它?
答案 0 :(得分:5)
简短的回答是,你得到了这个&#34;模糊的类型变量&#34;错误,因为您的约束(Integral a, Floating a)
不一致。没有类型可以满足这一要求,因此当默认尝试查找1
的类型(在输入表达式中)时,它就无法实现。
它从权力运算符(^)
获取左边的整数参数(2.5 ^ 2
无效,使用(^^)
)以及与float {进行比较}得到这些约束{1}}。我猜测只想使用1.0e-10
代替(^^)
并删除(^)
约束。
如果你正在做数字,你几乎肯定会最终需要Integral
和fromIntegral
,这是不同数字类型之间的大锤转换函数。只是为你做好准备。
还有一个指数运算符realToFrac
,它在左侧和右侧都采用小数。如果你好奇的话,Haskell有三个不同的取幂运算符的原因是另一个问题的素材。