`sequenceA`如何工作 [英] How `sequenceA` works
本文介绍了`sequenceA`如何工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是Haskell的新手,正试图了解它是如何工作的?
I'm new to Haskell and trying to understand how does this work?
sequenceA [(+3),(+2),(+1)] 3
我从定义开始
sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
然后展开递归
(:) <$> (+3) <*> $ (:) <$> (+2) <*> $ (:) <$> (+1) <*> pure []
(:) <$> (+3) <*> $ (:) <$> (+2) <*> $ (:) <$> (+1) <*> []
但是在这里,我不知道对于((->) r)
或[]
But here i don't understand for which applicative functor operator <*>
will be called, for ((->) r)
or for []
(:) <$> (+1) <*> []
有人可以一步一步解析sequenceA [(+3),(+2),(+1)] 3
吗?谢谢.
Can somebody go step by step and parse sequenceA [(+3),(+2),(+1)] 3
step by step? Thanks.
推荐答案
它正在使用instance Applicative ((->) a)
.
在ghci中尝试一下:
Try this in ghci:
Prelude> :t [(+3),(+2),(+1)]
[(+3),(+2),(+1)] :: Num a => [a -> a]
Prelude> :t sequenceA
sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)
和模式匹配参数类型:t = [], f = (->) a
并且应用约束位于f上.
and pattern match the argument type: t = [], f = (->) a
and the Applicative constraint is on f.
这篇关于`sequenceA`如何工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文