我正在尝试将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
应该是堆类型类中的函数。
我做错了什么?
答案 0 :(得分:3)
Haskell中的类型类与面向对象程序中的class
es不相关(那么多)。简单来说:type-class
对一组支持一组函数的data
个实例进行分组。
因此,您将类定义为
class Foo a where
bar :: a -> Bool
qux :: a
这并不意味着Foo
是一种类型,它意味着对于任何数据结构a
,instance
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}}更多是什么面向对象的编程语言称为“接口”。