相当于箭头符号中的遍历
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
可能是一个泛化抽象。
我正在使用 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
可能是一个泛化抽象。