Haskell容器类

Haskell容器类,haskell,Haskell,(有序)容器类是否有良好的标准(或只是稳定的)实现 容器类应该为其实例提供基本的操作操作。典型的例子应该是:数组、列表、e.t.c 行动包括: 从容器中取出第n个元素 取容器的n第一个元素 等等 为什么我需要这个?例如,在这个类的帮助下,我可以定义一些函数来处理容器中的某些内容,并将其用于我需要的任何容器。某种程度上。这不是Java,所以类型类层次结构非常罕见。然而,我认为折叠是你想要的 fold :: Monoid m => t m -> m foldMap :: Monoid

(有序)容器类是否有良好的标准(或只是稳定的)实现

容器类应该为其
实例提供基本的操作操作。典型的例子应该是:数组、列表、e.t.c

行动包括:

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

为什么我需要这个?例如,在这个类的帮助下,我可以定义一些函数来处理容器中的某些内容,并将其用于我需要的任何容器。

某种程度上。这不是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)

听起来你可能会觉得有趣
index
take
分别涵盖了您提到的两个操作,其中包括一些“典型实例”

Data.Key.index 具有多个实例,包括List、IntMap等


否,我确实需要按索引(或索引范围)返回的操作。我不需要皱褶。@Anonymous那么你就不走运了。有一些未知的
键控接口,但这并不是您真正想要的。然而,为什么不创建一个带有折叠的索引函数呢,这并不难example@jozefgI我认为你的例子在数组上是无效的。当然,我可以自己做,但我不想重新发明自行车。@AnonImous然后创建一个新的
索引的
类,并将其添加为默认实现,并为
数组
添加一个更高效的接口。