如何展开sequenceA的定义,以及它的递归基本情况?

win*_*412 1 haskell

sequenceA功能可以反转变量的容器非常棒- 例如,运行sequence (Just $ Right 3)会得到Right $ Just 3.我想展开sequenceA看它是如何工作的,但我被吸进去了...

-- source code of `sequenceA` for reference
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
traverse f = sequenceA . fmap f

sequenceA :: Applicative f => t (f a) -> f (t a)
sequenceA = traverse id

-- unfold it
> sequenceA (Just $ Right 3)
> (traverse id) (Just $ Right 3)
> (sequenceA . fmap id) (Just $ Right 3)
> sequenceA (fmap id (Just $ Right 3))
> (traverse id) (fmap id (Just $ Right 3))
> (sequenceA . fmap id) (fmap id (Just $ Right 3))
> traverse id . fmap id . fmap id $ Just (Right 3)
-- and so on...
> traverse id . fmap id . fmap id . fmap id $ Just (Right 3)
> traverse id . fmap id . fmap id . fmap id . fmap id $ Just (Right 3)
......
Run Code Online (Sandbox Code Playgroud)

递归基本情况在哪里?

Ry-*_*Ry- 5

一个Traversable必须实现至少一个traverse或的类型sequenceA.默认定义是从另一个派生一个功能的方法.

MaybeTraversable实施:

instance Traversable Maybe where
    traverse _ Nothing = pure Nothing
    traverse f (Just x) = Just <$> f x
Run Code Online (Sandbox Code Playgroud)

现在你可以扩展sequenceA (Just (Right 3))traverse id (Just (Right 3))= Just <$> id (Right 3)= Just <$> Right 3= Right (Just 3).