在Heap Typeclass上定义'empty'

时间:2015-02-25 02:59:20

标签: haskell

我正在尝试将ML代码从Purely Functional Data Structures复制到Haskell。

class (Ord a) => Heap a where
    empty :: Heap a
    ...

但是我得到了这个编译时错误:

Prelude> :l Heap.hs 
[1 of 1] Compiling Main             ( Heap.hs, interpreted )

Heap.hs:2:18:
    Expected kind ‘*’, but ‘Heap a’ has kind ‘Constraint’
    In the type ‘Heap a’
    In the class declaration for ‘Heap’

我认为empty应该是类型类中的函数。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

Haskell中的类型类与面向对象程序中的class es不相关(那么多)。简单来说:type-class对一组支持一组函数的data个实例进行分组。

因此,您将类定义为

class Foo a where
    bar :: a -> Bool
    qux :: a

这并不意味着Foo是一种类型,它意味着对于任何数据结构ainstance Foo,您应该实现这些方法。

从这个意义上来说,它更像是一个接口,类型本身就是一个类的实例。

现在您可以定义一个数据结构,例如“天真”的地图方法:

data ListMap a b = ListMap [(a,b)]

现在这意味着每个地图都存储为(a,b)元组与ListMap“构造函数”的列表。

然后,您可以为此类listmap定义empty方法:

empty :: ListMap a b
empty = ListMap []

这意味着您创建一个带有空列表的ListMap

如果您计划实现多个行为类似于地图的数据结构,那么构造class会很有用。在这种情况下,您可以定义:

class Map a where
    empty :: a

现在,您可以ListMap使用Map作为instance Map (ListMap a b) where empty = ListMap [] 的实例。

empty

稍后,如果要定义返回的函数,例如键列表等,则可以定义多参数类型类。

这样简单地回答你的问题:如果你使用一个类,a方法有签名class,但你应该首先定义一个数据结构,{{1}}更多是什么面向对象的编程语言称为“接口”。