箭怎么样?

Mat*_*hid 11 haskell

通过对Haskell的各种类别的主题类各种教程阅读,我们发现之类的东西Monoid,Functor,Monad等等-所有这些有几十个实例.但出于某种原因,当我们到达时Arrow,只有两个实例:函数和monad.在这两种情况下,使用Arrow实例都不如直接使用底层事物那样强大且困难.

有没有人有任何有趣的箭头例子?我肯定肯定会有一些,但我从来没有遇到任何关于他们的文章......

Gab*_*lez 8

我喜欢将Arrows视为可组合的有向无环图.例如,箭头类型:

SomeArrow (a, b, c) (d, e, f)
Run Code Online (Sandbox Code Playgroud)

......你能想到的是有类型的三个进入边的图a,b以及c和类型的三个出边d,ef.

使用此解释,Arrows 的类别组合操作类似于图形的水平连接,将它们的边连接在一起:

(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c
Run Code Online (Sandbox Code Playgroud)

......在哪里a,bc可能是他们自己的元组.同样,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在使用类型有向无环图时通常会出现这种情况.但是,您通常不会看到它们的原因通常是因为大多数人在心理上将图形与无类型和高性能数据结构相关联.

  • 我找到了证据的一部分,http://cdsmith.wordpress.com/2011/08/13/arrow-category-applicative-part-iia/.对于"类别"和"应用"的交互,它需要更多的公理,并且不会一直表明任何`Applicative``Category`也是'Arrow`. (2认同)

Ste*_*lla 7

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过滤器).