箭头表示法中的导线等效

时间:2016-12-01 09:07:21

标签: haskell arrows

我使用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 ,因为你不能只混合和匹配箭头表示法和正则表达式。

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

1 个答案:

答案 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可能是一个概括抽象。