【问题标题】:Why does mconcat require a list rather than a Foldable?为什么 mconcat 需要一个列表而不是一个可折叠的?
【发布时间】:2020-02-08 22:50:59
【问题描述】:

查看Monoid 的定义时,我注意到mconcat 具有以下定义(source):

mconcat :: Monoid a => [a] -> a
mconcat = foldr mappend mempty

为什么签名会将其限制为[a],而不是像这样更通用的Foldable

mconcat' :: (Foldable t, Monoid a) => t a -> a
mconcat' = foldr mappend mempty

这是出于历史原因吗?或者这种更通用的实现是否会使特定类型更难提供它的优化版本,例如这种情况。对于使用列表理解的[] (source)?

【问题讨论】:

  • 旧版本的foldr 仅适用于列表iirc。

标签: haskell monoids foldable


【解决方案1】:

虽然我不知道有关此类提案的实际讨论,但以下是一些可以想象的原因:

  • 泛化函数已作为fold from Foldable存在。

  • 事实上,mconcat 可能用作fold @[_] 的实现,这可能比某些幺半群的通常默认值更有效。 (这个想法来自GHC issue #17123。)

  • 更改类方法签名会导致流失,因为各处的实例都必须进行相应调整,因此往往仅在迫切需要时才这样做。 (顺便说一句,Monoid 本身是,though a carefully planned process,为了将Semigroup 添加为超类,这可能支持也可能不支持我的观点。)

  • mconcat 的特化类型是有意义的,体现了the list type is an encoding of the free monoid in Haskell 的意义。 (另一个有趣的事实是,可以根据mconcat 实现memptymappend。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2012-11-08
  • 2019-09-27
  • 2019-12-07
相关资源
最近更新 更多