haskell - 一般而言,可折叠仿函数是否有相当于头/尾的东西?

标签 haskell functor shift traversable foldable

我想表达以下 Haskell 代码,仅使用仿函数代数(即 - 不依赖于任何特定容器类型,例如 List ):

ys = zipWith (+) (head xs : repeat 0)
                 (tail xs ++ [y])

在我看来应该有办法做到这一点,只依赖于 Foldable (或者,也许, Traversable ),但我看不到它。

我很好奇:
  • 可折叠/可遍历仿函数是否有先行和后行的一般概念?
  • 是否有一种公认的惯用方式,仅使用仿函数代数来移动可折叠/可遍历仿函数的内容?
    (请注意,上面的计算可能用英语描述为“从右边移一个值,并将落在左边的值加回新的第一个值。”)
  • 最佳答案

    您可以找到 Foldable 的第一个或最后一个元素使用 FirstLast来自 Data.Monoid 的幺半群.

    foldMap (Last . Just)  :: Foldable t => t a -> Last a
    foldMap (First . Just) :: Foldable t => t a -> First a
    

    全部 Foldable可以转换为列表,因此因为您可以找到列表的头部和尾部,所以您可以为任何 Foldable 这样做.
    toList = foldr (:) [] :: Foldable t => t a -> [a]
    

    也就是说,尾部将具有列表类型,而不是 Foldable 的类型。 (除非它是一个列表)。这归根结底是因为不是所有 Foldable可以实现一个 uncons。例如:
    data Pair a = Pair a a
    这是Foldable ,但你不能代表 Pair 的尾部使用 Pair .

    关于haskell - 一般而言,可折叠仿函数是否有相当于头/尾的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50785210/

    相关文章:

    haskell - 无法定义多个可执行文件

    c++ - 将模板函数传递给 std::for_each

    Java 左移位返回错误值

    java - JavaFX 中是否有可能获得移位字符?

    Android Studio 无法正确绘制按钮

    math - 这是什么类型的数学 : a -> b -> c

    algorithm - haskell 中帕斯卡三角形的变体 - 惰性评估问题

    haskell - 如何让 Haskell QuickCheck 2.4 增加 # 个测试?

    c++ - 如何将运算符作为默认仿函数参数传递?