【问题标题】:Haskell Container classHaskell 容器类
【发布时间】:2014-01-04 14:14:41
【问题描述】:

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

容器类应该提供基本的操作操作,它是instances。典型的实例应该是:Array、List等

操作是:

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

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

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

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 不,我确实想要按索引(或索引范围)返回的操作。我不需要折叠。
      • @AnonImous 那你就不走运了。有一些不为人知的Keyed 接口,但这并不是您真正想要的。但是,为什么不直接创建带有折叠的索引函数呢,这并不难。
      • @AnonImous 我加了一个例子
      • @jozefgI 我认为您的示例对数组无效。当然,我可以自己制造,但我不想重新发明自行车。
      • @AnonImous 然后创建一个新的Indexed 类并将其添加为默认实现,并为Array 添加更高效的接口。
      【解决方案3】:

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

      http://hackage.haskell.org/package/keys-0.2.2/docs/Data-Key.html#g:5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        相关资源
        最近更新 更多