Haskell没有...出现的例子

时间:2016-11-28 11:16:34

标签: haskell

我试图写一个递归计算泰勒的函数:

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

它是什么意思以及如何解决它?

1 个答案:

答案 0 :(得分:5)

简短的回答是,你得到了这个&#34;模糊的类型变量&#34;错误,因为您的约束(Integral a, Floating a)不一致。没有类型可以满足这一要求,因此当默认尝试查找1的类型(在输入表达式中)时,它就无法实现。

它从权力运算符(^)获取左边的整数参数(2.5 ^ 2无效,使用(^^))以及与float {进行比较}得到这些约束{1}}。我猜测只想使用1.0e-10代替(^^)并删除(^)约束。

如果你正在做数字,你几乎肯定会最终需要IntegralfromIntegral,这是不同数字类型之间的大锤转换函数。只是为你做好准备。

还有一个指数运算符realToFrac,它在左侧和右侧都采用小数。如果你好奇的话,Haskell有三个不同的取幂运算符的原因是另一个问题的素材。