我喜欢将Arrows视为可组合的有向无环图.例如,箭头类型:
SomeArrow (a, b, c) (d, e, f)
Run Code Online (Sandbox Code Playgroud)
......你能想到的是有类型的三个进入边的图a,b以及c和类型的三个出边d,e和f.
使用此解释,Arrows 的类别组合操作类似于图形的水平连接,将它们的边连接在一起:
(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c
Run Code Online (Sandbox Code Playgroud)
......在哪里a,b也c可能是他们自己的元组.同样,id只是将所有传入边转发到传出边的标识图:
id :: SomeArrow a a
Run Code Online (Sandbox Code Playgroud)
另一个关键操作(***)就像图的垂直连接:
(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d)
Run Code Online (Sandbox Code Playgroud)
您可以将其视为并排放置两个图形,组合它们的输入边缘和输出边缘.
因此Arrow在使用类型有向无环图时通常会出现这种情况.但是,您通常不会看到它们的原因通常是因为大多数人在心理上将图形与无类型和高性能数据结构相关联.
HXT是一个用于解析XML的库,是箭头使用的一个很好的例子(看看这个词Arrow在这个包的模块名称中出现的频率!).你应该看一下很棒的教程:http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html
但是对于函数有箭头概念也是很好的.例如以下代码
((+1) &&& (*2)) 3 -- result is (4,6)
Run Code Online (Sandbox Code Playgroud)
只是工作,因为(->)是箭头类的实例(运算符&&&在Control.Arrow中定义).
由于使用了箭头语法,您还可以在Haskell中编写复杂的计算工具(它适用于HXT中的函数,monad和XML过滤器).