据我了解Foldable
,基本上表示具有许多相同类型的元素可以迭代的结构,即列表、映射、集合等。
是否有类似Appendable
或Insertable
基本上代表可以添加元素的结构的类?当然,不能保证检索元素的顺序。
如果已经有一个类,我宁愿自己不创建一个类。
您应该查看Data.Collections包。它包含Unfoldable
具有以下方法的类型类:
class Unfoldable c i | c -> i where
insert :: i -> c -> c
empty :: c
singleton :: i -> c
它还提供了insertMany
和insertManySorted
方法,将 a 中的所有元素插入Foldable
到 aUnfoldable
中。
如果你让你的类型成为两者的实例,Foldable
那么Unfoldable
你就可以从中插入和检索元素。
我认为插入本身并不是一个明智的概念。有更好的方法来概括这一点。例如Alternative
那里是一个明智的类型类。你会得到pure
单例和一些通用联合操作的形式<|>
。
是否有类似
Appendable
或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
请注意,如果您有Appendable
和Pointed
实例,您可以定义一个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
该包中的课程,它将两者Unfoldable
与Foldable
.