sequenceA是一个众所周知的函数:
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
我想知道我们是否可以为 Arrows 写下类似的东西。不幸的是,我没有设法实现以下内容:
sequenceArr :: (Traversable t, Arrow a) => t (a b c) -> a b (t c)
据我了解,Applicative泛化Arrow,因此,我们应该能够写下来。我这样做是为了列表:
sequenceArrLst :: Arrow a => [a b c] -> a b [c]
sequenceArrLst t = let t' = (>>> arr (: [])) <$> t
in foldr1 (\f g -> f &&& g >>> arr (uncurry (++))) t'
然而,正如人们注意到的那样,我们并没有摆脱列表中的a b图层,而是将结果包装到一个新列表中。那么,我们如何才能真正摆脱a b层呢?我应该注意到,在这个问题下的评论中,duplode指出:
...在
(.)、和之间id,没有任何东西可以将两层合二为一。arrfirsta r
如果他们是对的,我们需ArrowApply要这样做吗?坦率地说,我写下来了,仍然无法摆脱里面的箭头t:
sequenceArrApp :: (Functor f, ArrowApply a) => f (a b c) -> a b (f (a () c))
sequenceArrApp t = arr $ \ b -> (\ f -> arr (\ () -> (f, b)) >>> app) <$> t
可以调整这个片段以缺少a ()图层吗?
所以,我的问题是:
sequenceArr :: (Traversable t, Arrow a) => t (a b c) -> a b (t c)- 我们可以写下来吗?如果是这样,怎么做?- 有什么方法可以摆脱
a b层(Arrow a)。如果是这样,为什么当我们写下来时它们不起作用join(Arrow如果它们实际上没有)? - 我们需要
ArrowApply这个吗?如果是这样,怎么做?是否可以调整我的变体以获得此结果:sequenceArr :: (Traversable t, ArrowApply a) => t (a b c) -> a b (t c)?