分拆出来this https://stackoverflow.com/a/64068980/5825294问题。直觉上我明白了什么sequenceA
在该用例中确实如此,但不是how/why它是这样工作的。
所以这一切都归结为这个问题:如何sequenceA
在以下情况下工作?
> sequenceA [("a",1),("b",2),("c",3)]
("abc",[1,2,3])
我看到
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
所以在上面的用例中Traversable
is []
,以及Applicative
, since (,)
是一个二进制类型的构造函数,是(,) a
,这意味着该对被视为其上的应用函子snd
场地。这将最终的列表放在一起snd
结果。因此,我们从一个对列表转到第二个字段中有一个列表的对。
但是哪里有"abc"
来自?我的意思是,我知道这是fst
所有对中,但我不知道它是否是通过++
or via concat
的列表中的fst
s。里面好像什么都没有sequenceA
的签名以强制执行fst
这些对的 s 可以组合在一起。
但这个假设仍然必须在某个地方使用。确实,以下失败
sequenceA [('a',1),('b',2),('c',3)]