2012-07-19 92 views
3

我是Haskell的新手,并试图用实例创建一个类。Haskell无法创建TypeClass的实例

我有下面的代码,我想说的是: 1)科能在其第一位置保存任何类型, 2)使类线性这需要线性的东西,并返回一个数 3)制作如果分支持有的第一件东西是Num类的一部分,则分支Linear的一个实例。

data Branch a = Branch a Integer deriving (Show, Eq) 

class Linear l where 
    length :: (Num a) => l -> a 

instance (Num a) => Linear (Branch a) where 
    length (Branch len _) = len 

我得到的错误: 无法推断(一〜A1) 从由实例声明的约束范围内(民一).....

有谁知道如何表达在Haskell中,我想说什么?

回答

8

你的类定义说length必须能够返回用户请求的任何Num类型。所以如果用户想要一个整数,长度方法必须给他一个整数。如果他想要一个Int或Double,长度也必须给他。

但是,您在实例声明中提供的长度函数不符合要求。例如,当您拨打Branch Integer的长度时,长度将返回Integer。即使用户要求,它也不会返回IntDouble

使代码工作的一种方法是使用多参数类型类来定义具有两个参数的Linear,其中第二个类型是数字类型length应该返回。然后你可以有一个Linear (Branch a) a的实例。您可能还想使用功能依赖关系扩展来使其更加可用。而不是第二个类型参数,您也可以使用类型系列扩展来实现类似的效果。

另一种方法是将实例声明更改为需要Integral a而不是Num a,然后使用fromIntegral len作为返回值。这会将存储在分支中的整数类型转换为用户请求的任何数字类型。当然,警告是你用非整数数值分支,这样不会是Linear的实例。

+0

我试图理解多参数类型类,但它们超出了我的级别。 – WuHoUnited 2012-07-21 00:33:10