Haskell:“追加”类型类

时间:2012-07-11 16:34:48

标签: haskell typeclass

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

它还提供insertManyinsertManySorted方法,将Foldable中的所有元素插入Unfoldable

如果您将类型设为FoldableUnfoldable的实例,则可以从中插入和检索元素。

答案 1 :(得分:3)

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

答案 2 :(得分: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同样可以被视为克里斯泰勒建议的Unfoldable课程的伪装版本。不过,我会使用该软件包中的Collection类,它将UnfoldableFoldable结合起来。