Haskell 理解将(Erf prob)添加到实例声明错误的上下文

Haskell 理解将(Erf prob)添加到实例声明错误的上下文,haskell,Haskell,我试图理解为什么会出现以下错误 将Erf prob添加到实例声明的上下文中 我有一个简单的实例,它使用Data.Number.erf中的erf 但是ghc-7.6.3会抱怨上述问题,一个可能的解决方案是将实例浮动prob更改为实例浮动prob,Erf prob有人能解释为什么需要这样做吗? `如果您查看文档,您会发现 class Floating a => Erf a where erf :: a -> a 这意味着erf函数是erf类的一部分。它的类型是erf::erfa=>

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

将Erf prob添加到实例声明的上下文中

我有一个简单的实例,它使用Data.Number.erf中的erf

但是ghc-7.6.3会抱怨上述问题,一个可能的解决方案是将实例浮动prob更改为实例浮动prob,Erf prob有人能解释为什么需要这样做吗?
`

如果您查看文档,您会发现

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

在本例中,您已经调用了类型prob,因此我们需要Erf prob

事实上,因为Floating是Erf的一个超类,所以任何Erf实例都必须已经是Floating实例,所以不需要显式地指定它。这意味着你可以写作

instance (Erf prob) => CDF (Normal prob) where
   ...

如果你看一下文档,你会发现

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

在本例中,您已经调用了类型prob,因此我们需要Erf prob

事实上,因为Floating是Erf的一个超类,所以任何Erf实例都必须已经是Floating实例,所以不需要显式地指定它。这意味着你可以写作

instance (Erf prob) => CDF (Normal prob) where
   ...