gpt4 book ai didi

haskell - 为什么 Foldable 和 Functor 是分开的类?

转载 作者:行者123 更新时间:2023-12-03 15:22:55 27 4
gpt4 key购买 nike

wiki page说这两个类都处理容器操作,Foldable 是一类具有 foldr 的容器定义在它们之上,对于 Functor 它是 fmap .

但是,Foldable 类型和 Functor 类型之间的根本区别是什么?

wiki 暗示了这种区别:

The class [Foldable] does not require Functor superclass in order to allow containers like Set or StorableVector



但是我仍然不确定为什么不能映射一个集合来获得另一个集合,如果我解释正确的话。

最佳答案

FoldableFunctor为具有可以折叠(或减少)和映射的结构的类型提供两个单独的抽象。

Foldable 包含可以枚举和组合在一起的值1。可以将 Foldable 视为可以变成列表的东西(toList :: Foldable f => f a -> [a])。或者,可以将 Foldables 视为其值可以单向组合的结构:(Foldable t, Monoid m) => (a -> m) -> t a -> m (当然,这需要枚举它们的能力)。

另一方面,仿函数是允许“提升”函数(a -> b)的结构。申请a s 由结构 (fmap :: (a -> b) -> (f a -> f b)) 持有。 fmap必须保留被映射的结构:树必须具有前后相同的形状,列表必须具有相同数量的相同顺序的元素,Nothing不能变成东西,等等。另一方面,可折叠设备不需要保留这种结构;关键是要丢弃结构并产生一个新结构。

Wiki 提到无法为 fmap 提供类型类约束的事实。 . fmap :: (Ord a, Ord b) => (a -> b) -> Set a -> Set b与类定义的类型不统一,fmap :: (a -> b) -> f a -> f b , 没有约束。这为 Set 创建了一个实例不可能写。

然而,这只是一个语言实现问题,而不是关于集合的更深层次的数学陈述。 Foldable 没有 Functor 父类(super class)的真正原因仅仅是 there are Foldable instances which are not Functor instances .

  • “保持”有点松散,旨在在 "Functors are containers" 中进行解释。感知位置Proxy s a保持零 a,Identity a持有一个,Maybe a持有零或一,b -> a持有 |b|一个,等等。
  • 关于haskell - 为什么 Foldable 和 Functor 是分开的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33137555/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com