Haskell 哈斯凯尔:“这是一个很好的例子。”;附加“;类型类

Haskell 哈斯凯尔:“这是一个很好的例子。”;附加“;类型类,haskell,typeclass,Haskell,Typeclass,据我所知,基本上表示具有许多相同类型的元素的结构,这些元素可以被迭代,即列表、映射、集等 有没有像appendeable或Insertable这样的类,它基本上表示可以向其中添加元素的结构?当然,无法保证检索元素的顺序 如果已经有一个类,我不希望自己创建它。您应该看看这个包。它包含具有以下方法的可展开的类型类: class Unfoldable c i | c -> i where insert :: i -> c -> c empty :: c singleton

据我所知,基本上表示具有许多相同类型的元素的结构,这些元素可以被迭代,即列表、映射、集等

有没有像
appendeable
Insertable
这样的类,它基本上表示可以向其中添加元素的结构?当然,无法保证检索元素的顺序

如果已经有一个类,我不希望自己创建它。

您应该看看这个包。它包含具有以下方法的
可展开的
类型类:

class Unfoldable c i | c -> i where
  insert :: i -> c -> c
  empty :: c
  singleton :: i -> c
它还提供了
insertMany
insertManySorted
方法,将可折叠的
中的所有元素插入可展开的


如果您将您的类型设置为可折叠和可展开的实例,那么您可以从中插入和检索元素。

我认为插入本身并不是一个明智的概念。有更好的方法来概括这一点。例如,
Alternative
是一个合理的类型类。对于单例和一些形式为
的泛型联合操作,您可以得到
pure

有没有像
appendeable
Insertable
这样的类,它基本上表示可以向其中添加元素的结构

您希望更清楚地理解“添加元素”的含义。因为这有两种方式:

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
请注意,如果您有
可追加的
指向的
实例,则可以定义一个
可插入的

instance (Appendable c, Pointed c) => Insertable c where
    insert x xs = append (singleton x) xs
Insertable
类,以及用于实际访问集合元素的操作(例如
Foldable
类),同样可以用于定义
Appendable
实例

无论如何,我上面的mock
appendeable
类实际上只是伪装而已。我的
Insertable
同样可以看作是Chris Taylor建议的
unbovable
类的伪装版本。不过,我还是要使用这个包中的类,它将
可展开的
可折叠的

+1结合起来,表示“真的只是幺半群”。可追加类不会在上面添加任何内容,除非我遗漏了什么。