相当于箭头符号中的遍历

Equivalent of a traverse in arrow notation

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

我有一个简单的查询类型:

setCustomerAttributes :: Query (TagData, UserDetails) ()

其中 Query 是箭头 (TagData, UserDetails) 是输入,它 returns ().

现在我想编写一个查询,将多个 TagData 作为输入,然后对所有输入运行此查询。 基本上我想做这样的事情

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

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

做这样的遍历相当于什么箭头?

您需要比 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 可能是一个泛化抽象。