箭头表示法中的导线等效

Fre*_*rik 3 haskell arrows

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

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

setCustomerAttributes :: Query (TagData, UserDetails) ()
Run Code Online (Sandbox Code Playgroud)

Query箭头在哪里(TagData, UserDetails)输入并返回().

现在我想编写一个需要多个TagData输入的查询,并为所有这些查询运行此查询.基本上我想做这样的事情

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

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

箭头相当于做那样的遍历?

Ale*_*lec 5

你需要一些比Arrow你更强大的东西- 你需要的东西ArrowChoice.值得庆幸的是,这Query也是一个例子.你可以做一些有用的东西

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

我还在考虑是否有一些类似于traverse值得概括的有趣抽象.

编辑

如果有一个Arrow等价物,Traversing可能是一般化的抽象.