阅读有关Haskell各种类别主题类的各种教程,我们发现Monoid
,Functor
,Monad
等等 - 所有这些都有几十个实例。但出于某种原因,当我们到达Arrow
时,只有两个实例:函数和monad。在这两种情况下,使用Arrow
实例都不如直接使用底层事物那么强大且困难。
有没有人有任何有趣的箭头示例?我肯定肯定会有一些,但我从来没有写过关于他们的任何文章......
答案 0 :(得分:8)
我喜欢将Arrow
s视为可组合的有向无环图。例如,类型为箭头的箭头
SomeArrow (a, b, c) (d, e, f)
...您可以将其视为具有a
,b
和c
类型的三个传入边以及类型d
的三个传出边的图, e
和f
。
使用这种解释,Arrow
的类别组合操作就像图形的水平连接一样,将它们的边连接在一起:
(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c
...其中a
,b
和c
可能是自己的元组。同样,id
只是将所有传入边转发到传出边的标识图:
id :: SomeArrow a a
另一个关键操作是(***)
,就像图的垂直连接一样:
(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d)
您可以将其视为并排放置两个图形,组合它们的输入边缘和输出边缘。
因此在处理类型化有向无环图时通常会出现Arrow
。但是,您通常不会看到它们的原因通常是因为大多数人在心理上将图形与无类型和高性能数据结构相关联。
答案 1 :(得分:7)
HXT,一个用于解析XML的库,是使用箭头的一个很好的例子(看看这个包的模块名称中出现单词Arrow
的频率! )。你应该看一下很棒的教程:http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html
但是对于函数有箭头概念也是很好的。例如以下代码
((+1) &&& (*2)) 3 -- result is (4,6)
正常工作,因为(->)
是箭头类的一个实例(Control.Arrow中定义了运算符&&&
)。
感谢arrow syntax,您还可以在Haskell中编写复杂的计算工具(它适用于HXT中的函数,monad和XML过滤器)。