gpt4 book ai didi

list - 如何为 Arrows 写下序列?

转载 作者:行者123 更新时间:2023-12-04 09:32:35 27 4
gpt4 key购买 nike

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层?我应该注意到,在 this question 下的评论中, duplode指出:

...between (.), id, arr and first, there isn't anything that allows collapsing two a r layers into one.


如果他们是对的,我们是否需要 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 for Arrow 时它们不起作用?下来(如果他们实际上没有)?
  • 需要吗ArrowApply为了这?如果是这样,如何?是否可以调整我的变体以获得此结果:sequenceArr :: (Traversable t, ArrowApply a) => t (a b c) -> a b (t c) ?
  • 最佳答案

    As far as I understand, Applicative generalizes Arrow, thus, we should be able to write this down.


    请记住,这里的“泛化”实际上意味着“如果我们确定 Arrow 的输入类型参数,则生成的 * -> * 类型构造函数将是 Applicative”,即 sequenceArr您最初提出的金额为 sequenceA专门用于可以以这种方式从箭头中挤出的应用程序。由于这些应用程序可以通过 the WrappedArrow newtype 表示,一种可能的定义是:
    sequenceArr :: (Traversable t, Arrow a) => t (a b c) -> a b (t c)
    sequenceArr = unwrapArrow . sequenceA . fmap WrapArrow
    怎么看 WrappedArrow实例化 Applicative ...
    instance Arrow a => Applicative (WrappedArrow a b) where
    pure x = WrapArrow (arr (const x))
    liftA2 f (WrapArrow u) (WrapArrow v) =
    WrapArrow (u &&& v >>> arr (uncurry f))
    ... 应该确认此实现与您的写作尝试在精神上一致 sequenceArrLst .
    (注意这个 sequenceArr 确实与 traverse' Data.Profunctors.Traversing 非常不同,后者是 discusses in the comments 。而不是 sequenceA 的特化, traverse' 概括了 5 到其他 |7 到其他 |911尺寸。)

    关于list - 如何为 Arrows 写下序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62762965/

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