1

我试图了解为什么会出现以下错误,

add (Erf prob) to the context of the instance declaration

我有一个使用erffrom的简单实例Data.Number.Erf

instance (Floating prob) => CDF (Normal prob) where
    cdf dist dp = ( 0.5 * ( 1 + erf ( (x - mu)/ (sqrt $ sigma2 *2) )))

但是 ghc-7.6.3 会抱怨上述问题,一个可能的解决方法是更改instance (Floating prob)​​为instance(Floating prob, Erf prob)任何人都可以解释为什么需要这样做吗?`

4

1 回答 1

5

如果您查看Data.Number.Erf的文档,您会看到

class Floating a => Erf a where
  erf :: a -> a

这意味着该erf函数是Erf类的一部分。它的类型是erf :: Erf a => a -> a. 这意味着您需要添加到在上使用它的任何函数的类型Erf a的上下文(在 之前的位) ,以确保为 type 的值定义了它。=>aerfa

在这种情况下,您已经调用了该类型prob,因此我们需要Erf prob.

事实上,由于Floating是 的超类Erf,任何作为 的实例的东西都Erf必须已经是 的实例Floating,因此您无需明确指定。这意味着你可以写

instance (Erf prob) => CDF (Normal prob) where
   ...
于 2013-06-02T22:02:14.853 回答