Haskell:“Append”类型类

3
据我理解,Foldable基本上代表具有可以迭代的相同类型的多个元素的结构,例如列表、映射、集合等。
是否有像AppendableInsertable这样的类,它基本上表示可以向其中添加元素的结构?当然,不能保证检索元素的顺序。
如果已经存在这样的类,我不想自己创建一个。
3个回答

7

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

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

它还提供了insertMany和insertManySorted方法,可以将Foladable中的所有元素插入到Unfoldable中。如果您的类型是Foldable和Unfoldable的实例,则可以同时插入和检索其中的元素。

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提出的Unfoldable类的一个伪装版本。我会选择该软件包中的Collection类,它将UnfoldableFoldable结合在一起。

+1 是“真正的 Monoid”。在我看来,Appendable 类并没有添加任何东西,除非我漏掉了什么。 - Thomas Eding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接