在Haskell中实现一个简单的关联映射

时间:2012-12-05 18:21:29

标签: haskell dictionary map constructor associative

在这个时期我正在学习Haskell但是我在解决一个简单的练习时遇到了问题。

我想写一个简单的关联地图数据结构来锻炼自己。

这是我到目前为止编写的代码:

-- It represents a simple ordered couple in the form (key, value)
data Element a b = Element (a, b)
    deriving (Show)

-- It represents a (unordered) list of elements in the form (key, value)
data Dictionary a b = Dictionary [Element a b]
    deriving (Show)

-- It represents a simple dictionary which will be used for my tests
t :: Dictionary Char Int
t = Dictionary [Element ('a', 1), Element ('b', 2), Element ('a', 3)]

现在我正在尝试编写一个简单的方法来返回表单(a,b)中的一对夫妇列表。我这样做是为了锻炼自己,并提供一个对其他方法有用的简单函数(查找等)。

我写了这段代码,但我知道这是错的:

couples :: Dictionary a b -> [(a, b)]
couples (Dictionary t) = [(k , v) | (k, v) <- t]

问题是显然“t”不是一对夫妇的列表:它由一个元素列表组成,这些元素由一个类型构造函数“Element”组成,后跟一个有序的对。

我怎么能“摆脱”“元素”类型的构造函数?我不知道......

提前谢谢。

1 个答案:

答案 0 :(得分:4)

只需在模式匹配中添加Element构造函数。

couples :: Dictionary a b -> [(a, b)]
couples (Dictionary t) = [(k , v) | (Element (k, v)) <- t]