【发布时间】:2014-01-04 14:14:41
【问题描述】:
是否有(有序)Container 类的良好标准(或只是稳定)实现?
容器类应该提供基本的操作操作,它是instances。典型的实例应该是:Array、List等
操作是:
- 从容器中取出
n'th 元素; - 取
n容器的第一个元素; - 等等。
我为什么需要这个?例如,借助这个类,我可以定义一些函数来处理容器中的某些内容,并将其与我需要的任何容器一起使用。
【问题讨论】:
标签: haskell
是否有(有序)Container 类的良好标准(或只是稳定)实现?
容器类应该提供基本的操作操作,它是instances。典型的实例应该是:Array、List等
操作是:
n'th 元素;n容器的第一个元素;我为什么需要这个?例如,借助这个类,我可以定义一些函数来处理容器中的某些内容,并将其与我需要的任何容器一起使用。
【问题讨论】:
标签: haskell
听起来您可能会觉得ListLike 很有趣。 index 和 take 分别涵盖了您提到的两个操作,其中包括一些“典型实例”。
【讨论】:
有点。这不是 Java,所以类型类层次结构非常罕见。但是,我认为可折叠是您想要的
fold :: Monoid m => t m -> m
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b
foldl :: (b -> a -> b) -> b -> t a -> b
一个示例索引函数,
index i = snd . foldl' choose (0, Nothing)
where choose (j, Just x) _ = (j, Just x)
choose (j, Nothing) x | i == j = (i, Just x)
| otherwise = (j + 1, Nothing)
现在使用它,您可以轻松地将任何集合展平为列表并将其视为列表,并且有更智能的方法可以折叠集合并保留第 i 个条目。
要修改它,你可以使用 traversable.这是另一个类,有一些基于
的函数traverse :: Applicative f => (a -> f b) -> t a -> f (t a)
【讨论】:
Keyed 接口,但这并不是您真正想要的。但是,为什么不直接创建带有折叠的索引函数呢,这并不难。
Indexed 类并将其添加为默认实现,并为Array 添加更高效的接口。
Data.Key.Indexed 有多个实例,包括 List、IntMap 等
http://hackage.haskell.org/package/keys-0.2.2/docs/Data-Key.html#g:5
【讨论】: