通过阅读有关Haskell各种类别主题类的各种教程,我们可以找到类似的东西 Monoid
, Functor
, Monad
等等 - 所有这些都有几十个实例。但出于某种原因,当我们到达时 Arrow
,只有两个实例:函数和monad。在这两种情况下,使用 Arrow
实例比直接使用底层事物更不强大,也更困难。
有没有人 有趣 箭的例子?我肯定肯定会有一些,但我从来没有遇到任何关于他们的文章......
通过阅读有关Haskell各种类别主题类的各种教程,我们可以找到类似的东西 Monoid
, Functor
, Monad
等等 - 所有这些都有几十个实例。但出于某种原因,当我们到达时 Arrow
,只有两个实例:函数和monad。在这两种情况下,使用 Arrow
实例比直接使用底层事物更不强大,也更困难。
有没有人 有趣 箭的例子?我肯定肯定会有一些,但我从来没有遇到任何关于他们的文章......
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)。
感谢 箭头语法 你也有一个很好的工具来编写Haskell中的复杂计算(它也适用于HXT中的函数,monad和XML过滤器)。
我想想 Arrow
s作为可组合的有向无环图。例如,箭头类型:
SomeArrow (a, b, c) (d, e, f)
...您可以将其视为具有三个类型的传入边的图 a
, b
,和 c
和三个类型的传出边 d
, e
,和 f
。
使用此解释,类别组合操作 Arrow
s就像图形的水平连接,将它们的边连接在一起:
(.) :: 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
通常在使用类型有向无环图时出现。但是,您通常不会看到它们的原因通常是因为大多数人在心理上将图形与无类型和高性能数据结构相关联。