我想表达以下 Haskell 代码,仅使用仿函数代数(即 - 不依赖于任何特定容器类型,例如 List
):
ys = zipWith (+) (head xs : repeat 0)
(tail xs ++ [y])
在我看来应该有办法做到这一点,只依赖于
Foldable
(或者,也许, Traversable
),但我看不到它。我很好奇:
(请注意,上面的计算可能用英语描述为“从右边移一个值,并将落在左边的值加回新的第一个值。”)
最佳答案
您可以找到 Foldable
的第一个或最后一个元素使用 First
或 Last
来自 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/