【问题标题】:Equivalent of a traverse in arrow notation等效于箭头符号中的遍历
【发布时间】:2016-12-01 09:07:20
【问题描述】:

我正在使用 hasql 库与 PostgreSQL 数据库进行交互,它使用箭头进行查询和查询组合。

我有一个关于这种类型的简单查询:

setCustomerAttributes :: Query (TagData, UserDetails) ()

其中Query 是箭头(TagData, UserDetails) 是输入,它返回()

现在我想编写一个查询,它需要几个TagData 作为输入,然后对所有这些都运行这个查询。 基本上我想做这样的事情

setManyCustomerAttributes :: Query ([TagPair], Customer) ()
setManyCustomerAttributes = proc (pairs, customer) -> do
  returnA -< traverse_ (\pair -> setCustomerAttribute -< (pair, customer)) pairs

但是这当然会产生错误Arrow command found where expression was expected,因为您不能像这样混合和匹配箭头符号和正则表达式。

箭头相当于进行这样的遍历?

【问题讨论】:

    标签: haskell arrows


    【解决方案1】:

    你需要比Arrow 更强大的东西——你需要ArrowChoice。值得庆幸的是,Query 也是一个例子。您可以使用

    setManyCustomerAttributes :: Query ([TagData], UserDetails) ()
    setManyCustomerAttributes = proc (pairs,customer) ->
            case pairs of
              [] -> returnA -< ()
              (p:ps) -> do
                 setCustomerAttributes -< (p,customer)
                 setManyCustomerAttributes -< (ps,customer)
    

    我仍在考虑是否有一些类似于traverse 的有趣抽象值得在这里概括。

    编辑

    如果有一个 Arrow 等价物,Traversing 可能是一个泛化抽象。

    【讨论】:

    • 看似简单! ^^ 这很好用,我在旧曲目中想了太多,无法真正退后一步,尝试进行正常的大小写匹配递归。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多