2012-07-11 128 views
2

据我了解Foldable基本上代表有许多可遍历,即列表,地图,套相同类型的要素结构等哈斯克尔:“追加”类型的类

是否有类似AppendableInsertable它基本上代表结构可以添加元素?当然,不能保证检索元素的顺序。

如果已经有一个,我宁愿不创建一个类。

回答

6

你应该看看Data.Collections包。它包含类型类使用以下方法:

class Unfoldable c i | c -> i where 
    insert :: i -> c -> c 
    empty :: c 
    singleton :: i -> c 

它还提供insertManyinsertManySorted方法,所有从一个Foldable的元素插入到一个。

如果您将您的类型设置为Foldable和的实例,那么您既可以插入也可以从中检索元素。

3

我认为插入本身并不是一个明智的概念。有更好的方法来概括这一点。例如Alternative是一个合理的类型。您可以获得pure单身人士和一些通用工会<|>的形式进行操作。

3

是否有像AppendableInsertable这样的类,它基本上代表了可以添加元素的结构?

你想更清楚你的意思是“添加元素”。因为有两个方面,这可以去:

class Insertable c where 
    -- Add one element to the collection. 
    insert :: a -> c a -> c a 

class Appendable c where 
    -- Append a collection to another. 
    append :: c a -> c a -> c a 

后者,你会注意到,除非你添加一个操作这样的不支持添加一个孤独a到集合:

class Pointed c where 
    singleton :: a -> c a 

注意如果你有AppendablePointed情况下,你可以定义一个Insertable

instance (Appendable c, Pointed c) => Insertable c where 
    insert x xs = append (singleton x) xs 

Insertable类,以及用于实际访问集合的元素的操作(例如, Foldable类)也可以用来定义一个Appendable实例。

在任何情况下,我的模拟Appendable上面的类真的只是Monoid变相。同样可以将我的Insertable视为Chris Taylor建议的类的变形版本。尽管如此,我还是选择了Collection这个类,它将和Foldable结合起来。

+0

对于“真的只是Monoid”+1。 Appendable类不会在IMO上添加任何内容,除非我错过了某些东西。 – 2012-07-11 20:13:23