gpt4 book ai didi

haskell - Traversable 类型类的目的

转载 作者:行者123 更新时间:2023-12-03 22:50:25 26 4
gpt4 key购买 nike

有人可以向我解释一下,typeclass Traversable 的目的是什么? ?

类型类定义是:

class (Functor t, Foldable t) => Traversable (t :: * -> *) where

所以 TraversableFunctor tFoldable t .
traverse函数是 Traversable 的成员并具有以下签名:
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)

为什么必须将结果包装到应用程序中?它的意义是什么?

我有以下示例:
module ExercisesTraversable where

import Test.QuickCheck (Arbitrary, arbitrary)
import Test.QuickCheck.Checkers (quickBatch, eq, (=-=), EqProp)
import Test.QuickCheck.Classes (traversable)

type TI = []

newtype IdentityT a = IdentityT a
deriving (Eq, Ord, Show)

instance Functor IdentityT where
fmap f (IdentityT a) = IdentityT (f a)

instance Foldable IdentityT where
foldMap f (IdentityT a) = f a

instance Traversable IdentityT where
traverse f (IdentityT a) = IdentityT <$> f a

instance Arbitrary a => Arbitrary (IdentityT a) where
arbitrary = do
a <- arbitrary
return (IdentityT a)

instance Eq a => EqProp (IdentityT a) where (=-=) = eq

main = do
let trigger = undefined :: TI (Int, Int, [Int])
quickBatch (traversable trigger)

我们来看看 traverse执行:
traverse f (IdentityT a) = IdentityT <$> f a

应用程序的结果类型 f a必须是应用程序,为什么?仿函数还不够吗?

最佳答案

Identity是一个糟糕的例子,因为它总是只包含一个值。你是对的——在这种情况下,Functor f约束就足够了。但很明显,大多数可遍历对象在结构上并不是那么微不足道。

什么traverse所做的是:它以某种指定的顺序“访问”容器中的所有元素,对它们执行一些操作,并按原样重建结构。这比任何一个都更强大

  • Functor t ,它还允许您访问/修改所有元素并重建结构,但只能彼此完全独立(因此允许选择任意计算顺序,在任何元素之前返回结构的 thunk (懒惰地)完全映射,等等)。
  • Foldable t ,它使元素以线性顺序排列,但不重构结构。基本上,Foldable只是可以降级为简单列表的容器类,如
    toList :: Foldable t => t a -> [a]

    ...或任何单曲面类型的串联,通过
    foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m

    在这里,对每个元素的运算结果通过幺半群运算进行组合(或者,如果没有元素,则结果为 mempty )。

  • 如果是 traverse , Applicative f约束基本上将这个幺半群组合提升到你也可以重建结构的东西上。对应的是
    mempty      ::   m
    pure mempty :: f m


    (<>)        ::   m ->   m ->   m
    liftA2 (<>) :: f m -> f m -> f m

    ...但除此之外,因为 f也是一个仿函数,您可以将本地结果包装在任何数据构造函数中,从而不仅可以构建一个通用的类似列表的东西,还可以构建一个任意容器,包括具有原始结构的容器。

    关于haskell - Traversable 类型类的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45798242/

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