Haskell容器类

时间:2014-01-04 14:14:41

标签: haskell

(有序)Container类是否有良好的标准(或稳定)实现?

Container类应该使用instance来提供基本的操作操作。典型的实例应该是:Array,List,e.t.c。

操作是:

  • 从容器中取出n个元素;
  • n容器的第一个元素;
  • 等等。

为什么我需要这个?在这个类的帮助下,我可以,例如,定义一些处理容器中的东西的函数,并将它与我需要的任何容器一起使用。

3 个答案:

答案 0 :(得分:3)

听起来你可能会发现ListLike很有趣。 indextake分别涵盖了您提到的两个操作,其中包含一些“典型实例”。

答案 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