我使用hasql库与PostgreSQL数据库进行交互,并使用Arrows进行查询和查询合成。
我有一个这种类型的简单查询:
template = Template('''<!doctype html>
<html>
<body>
<div style="display: flex; flex-direction: row">
{% for image in images %}
<img src="{{ image }}" />
{% endfor %}
</div>
</body>
</html>''')
list_of_images = [1.png, 2.png, ... 15.png]
html = template.render(images=list_of_pict)
with open("my_new_file.html", "wb") as fh:
fh.write(html)
p = subprocess.Popen(['wkhtmltopdf', '-', 'Memory_usage.pdf'], stdin=subprocess.PIPE, universal_newlines=True)
p.communicate(html)
p.wait()
其中setCustomerAttributes :: Query (TagData, UserDetails) ()
是箭头Query
是输入,它返回(TagData, UserDetails)
。
现在我想编写一个以()
为输入的查询,并为所有这些查询运行此查询。
基本上我想做这样的事情
TagData
然而,这当然会产生错误setManyCustomerAttributes :: Query ([TagPair], Customer) ()
setManyCustomerAttributes = proc (pairs, customer) -> do
returnA -< traverse_ (\pair -> setCustomerAttribute -< (pair, customer)) pairs
,因为你不能只混合和匹配箭头表示法和正则表达式。
箭头相当于做那样的遍历?
答案 0 :(得分: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)
我还在考虑是否有一些类似于traverse
的有趣抽象,值得在这里进行概括。
如果有Arrow
个等价物,Traversing
可能是一个概括抽象。