(有序)Container类是否有良好的标准(或稳定)实现?
Container类应该使用instance
来提供基本的操作操作。典型的实例应该是:Array,List,e.t.c。
操作是:
n
个元素; n
容器的第一个元素; 为什么我需要这个?在这个类的帮助下,我可以,例如,定义一些处理容器中的东西的函数,并将它与我需要的任何容器一起使用。
答案 0 :(得分:3)
听起来你可能会发现ListLike很有趣。 index
和take
分别涵盖了您提到的两个操作,其中包含一些“典型实例”。
答案 1 :(得分:2)
有点儿。这不是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)
答案 2 :(得分:2)
Data.Key.Indexed 有几个实例,包括List,IntMap等等
http://hackage.haskell.org/package/keys-0.2.2/docs/Data-Key.html#g:5