【问题标题】:Foldable vs Traversable可折叠与可遍历
【发布时间】:2016-03-08 02:18:26
【问题描述】:

在深入研究Applicative的过程中,我来到了Traversable。虽然我已经从LYHGG知道Foldable,但是我还没有看到前者,所以我开始阅读Haskell wiki about Traversable

阅读时,我明白为什么Foldable.foldTraversable.sequenceA 平行,而Foldable.foldMapTraversable.traverse 平行。

我还看到每个Traversable 也是一个Foldable 和一个Functor,并且sequenceAtraversal 在彼此方面都有一个默认实现:

traverse f = sequenceA . fmap f
sequenceA = traverse id

所以,正如我在 LYHGG 中看到的,foldMapFoldable 的最小完整定义,我认为它与traverse 平行,所以fold(与sequenceA 平行)也将是一个最小的完整定义(它不是)...Foldable 不像 Traversable 那样是 Functor,所以我们不能应用这个:

foldMap f = fold . fmap f
fold = foldMap id -- this is ok

为什么不是每个Foldable 都是Functor,以及实际上不是FunctorFoldable 实例是什么?

【问题讨论】:

  • SetFoldable 不是Functor 的经典示例。未装箱的向量也是如此。
  • @dfeuer 我将阅读更多关于Set 的信息以了解为什么它不是Functor,但是,集合可以被认为是不重复事物的容器......说,我无法很快弄清楚为什么它不是Functor 实例...
  • 问题是Functor 没有给实现机会来约束它们的类型参数。想象一下,如果有人写了fmap f sf :: Int -> Integer -> IntegerInteger -> Integer 类型甚至不是Eq 的实例,更不用说Ord,因此在映射时无法检查重复项。该函数可以将多个元素映射到相同的函数,并且您无法折叠重复项。
  • 未装箱的向量只能包含“无法装箱”的东西,所以如果xs :: U.Vector Intfmap Just xs 必须产生U.Vector (Maybe Int) 类型的东西,这不是真实的东西。
  • 据我了解,Traversable 类是首先构思的(例如,McBride 和 Patterson,"Applicative Programming with Effects";Gibbons 和 Oliveira,"The Essence of the Iterator Pattern")。由于“不是Functors 的容器”问题,Foldable 被添加为超类。但是foldMapConst 应用程序不兼容,如 Gibbons 和 Oliveira 的论文所示。

标签: haskell functor applicative foldable traversable


【解决方案1】:

正如 dfeuer 所说,SetFoldable 不是 Functor 的一个很好的例子。

考虑Set.map的类型:

map :: Ord b => (a -> b) -> Set a -> Set b

请注意,这几乎fmap,但它需要一个额外的Ord b 约束。由于您有此约束,因此不能将其设为 Functor 的实例。

请注意,Set 不是 Haskell 上的函子,即使有此限制。如果巧妙地设置Eq 实例,我们可以违反fmap f . fmap g === fmap (f . g) 的法律。请参阅此Stack Overflow question 以进行进一步讨论。

如上所述,Set Hask 的子类别”上的(endo)函子,具有作为集合的有序类型和 保序映射作为态射。

因此,即使不明显,我们无法将 Set 设为仿函数这一事实实际上暗示了一个真正的数学问题,而不仅仅是我们类型类机制的限制。

【讨论】:

  • 我认为令人惊奇的是,它在数学上是一个 Functor,但由于这个限制,它不能是 Functor 类型类的 instance... 你不认为这类似于语言中的“不完美”? (无论如何,这种语言真的很漂亮、简洁、强大!)
  • @FtheBuilder 我编辑了我的答案以描述更多上下文。
  • 我知道我不应该在评论中说“谢谢”,但真的,你的解释非常有趣! :D
  • “作为态射的保序映射”的东西似乎很受限制;我天真地认为“保持平等”就足够了。你能评论一下吗?
  • @DanielWagner,我想知道同样的事情。保持秩序可以提高效率,但我认为这不是绝对必要的。
猜你喜欢
  • 2021-05-04
  • 2021-10-12
  • 2015-12-25
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多