【问题标题】:Why Monoid is not a requirement for foldr/foldl?为什么 Monoid 不是 foldr/foldl 的要求?
【发布时间】:2016-06-22 16:42:31
【问题描述】:

我正在查看 Haskell 中的 Foldable 课程。 fold、foldMap 中的两个方法需要一个 Monoid 实例。但是foldr 或foldl 没有这样的限制。

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

为了foldr/foldl 的结果是等价的,它不应该限制给定的折叠函数是关联的吗?有没有同一个list中foldr/foldl的结果不同的例子?

Foldable 实例不应该包装 Monoidal 值吗?还是 Foldable 更通用?

【问题讨论】:

  • 看foldr和foldl的第一个函数的类型。一个幺半群不适合那里。
  • @pdexter 不,Monoid 是唯一对标准折叠真正有意义的东西,因为一切都被视为“某种列表”。无论类型被视为具有更复杂的结构,名称中的“左”和“右”都不再有意义。如果你想折叠任何不是列表的东西,你真的必须提供更复杂的代数。
  • 函数组合是关联的:foldr :: (a -> b -> b) -> b -> t a -> b,foldr (c :: (a -> b -> b)) :: b -> t a -> b,c (x :: a) :: b -> b,所以我们可以组合c x1,@987654335 @, ..., c xn 以我们喜欢的任何顺序,因为 / IOW 内函数 do 形成了一个幺半群,Endo b,所有这些都是自己的。与例如列表,(x :) == ([x] ++),即我们可以用一些合适的f和c x . c y ~= f x <> f y将c表示为c x = (f x <>)。 (或类似的东西)。

标签: haskell fold monoids foldable


【解决方案1】:

为了foldr/foldl 的结果是等价的,它不应该限制给定的折叠函数是关联的吗?有没有foldr/foldl的结果在同一个列表中不同的例子?

是的。如果你传递一个非关联函数(比如减法(-)),你绝对会得到不同的结果。正如您正确指出的那样,没有Monoid 实例对应于(-) 之类的东西。

但这是设计使然。 Foldable 实例没有这样的限制,foldr 和 foldl 必须采用关联函数。在某些情况下,您可能想用减法之类的方法弃牌。 Foldable f 的一个实例对限制 f 可以做什么更感兴趣。具体的法律是:

foldr f z t = appEndo (foldMap (Endo . f) t ) z
foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z
fold = foldMap id

-- if f is a Functor
foldMap f = fold . fmap f
foldMap f . fmap g = foldMap (f . g)

您可以在源代码中看到 foldr 默认情况下对 newtype Endo a = Endo (a -> a) 内同态幺半群做了一些聪明的事情:

-- | Right-associative fold of a structure.
--
-- @'foldr' f z = 'Prelude.foldr' f z . 'toList'@
foldr :: (a -> b -> b) -> b -> t a -> b
foldr f z t = appEndo (foldMap (Endo #. f) t) z

从可能的非单曲面 f 和 z 中构建单曲面折叠。

所以最终答案是“为什么 Monoid 不是必需的?”是非常无聊的“因为它更实用,最终,没有必要。”

有关更多信息,请参阅开始这一切的论文,Applicative Programming with Effects。

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2011-05-13
    • 2010-09-27
    • 2011-08-28
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多