根据我的理解Foldable
基本上代表了具有许多可以迭代的相同类型元素的结构,即列表,地图,集合等。
是否有像Appendable
或Insertable
这样的类,它基本上代表了可以添加元素的结构?当然,不能保证检索哪些元素的顺序。
如果已经有一个类,我宁愿不自己创建一个类。
答案 0 :(得分:7)
您应该查看Data.Collections包。它包含Unfoldable
类型类,包含以下方法:
class Unfoldable c i | c -> i where
insert :: i -> c -> c
empty :: c
singleton :: i -> c
它还提供insertMany
和insertManySorted
方法,将Foldable
中的所有元素插入Unfoldable
。
如果您将类型设为Foldable
和Unfoldable
的实例,则可以从中插入和检索元素。
答案 1 :(得分:3)
我认为插入本身并不是一个明智的概念。有更好的方法来概括这一点。例如,Alternative
是一个明智的类型。您以pure
的形式获得<|>
单身人士和一些通用联盟操作。
答案 2 :(得分:3)
是否有像
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
。我的Insertable
同样可以被视为克里斯泰勒建议的Unfoldable
课程的伪装版本。不过,我会使用该软件包中的Collection
类,它将Unfoldable
与Foldable
结合起来。