3

据我了解Foldable,基本上表示具有许多相同类型的元素可以迭代的结构,即列表、映射、集合等。

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

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

4

3 回答 3

7

您应该查看Data.Collections包。它包含Unfoldable具有以下方法的类型类:

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

它还提供了insertManyinsertManySorted方法,将 a 中的所有元素插入Foldable到 aUnfoldable中。

如果你让你的类型成为两者的实例,Foldable那么Unfoldable你就可以从中插入和检索元素。

于 2012-07-11T16:44:32.360 回答
3

我认为插入本身并不是一个明智的概念。有更好的方法来概括这一点。例如Alternative那里是一个明智的类型类。你会得到pure单例和一些通用联合操作的形式<|>

于 2012-07-11T17:13:22.150 回答
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伪装。MyInsertable也可以被视为 Chris Taylor 建议Unfoldable课程的伪装版本。不过,我会选择Collection该包中的课程,它将两者UnfoldableFoldable.

于 2012-07-11T18:54:35.270 回答