2014-04-04 83 views
11

通过阅读关于Haskell各种以类别为主题的类的各种教程,我们发现诸如MonoidFunctor,Monad等等 - 所有这些都有几十个实例。但由于某种原因,当我们到达Arrow时,只有两个实例:函数和monad。在这两种情况下,使用Arrow实例都不如直接使用底层事物更强大也更困难。箭头怎么样?

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

+0

[相关](http://programmers.stackexchange。com/questions/114681 /这是什么目的的箭头) – bheklilr

+0

基于箭头的玻璃钢是否符合要求? –

+1

我对Haskell中的箭头的理解是,它们或多或少地为您提供了电路的语言,其中一个组件取决于之前的输出。你可能会问这与正常的函数组合和组合有什么不同,但是正常的函数不能带有额外的上下文和结构,而箭头则更抽象并且可以。这就是为什么他们在FRP中非常受欢迎,您可以编写看起来很纯的有效代码,并且可以非常轻松地推理。它们也用于Hxt库,通过看似纯粹的计算来流式传输XML数据。 – bheklilr

回答

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中的函数,monads和XML过滤器)。

+0

HXT看起来很有趣。对于为什么大多数解析器库是可用的仿函数(或单子)的任何评论,但这是一个箭头? – MathematicalOrchid

8

我喜欢将Arrow s看作可组合的有向非循环图。例如,类型的箭头:

SomeArrow (a, b, c) (d, e, f) 

......你能想到的为具有a型,b三个入边,和cd类型,e三个边,和f图。

使用这种解释,为Arrow S中的类的操作组合是像图横向拼接,其边缘连接在一起:

(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c 

...其中abc可能是自己的元组。同样,id仅仅是所有入边转发给外出边缘身份图:

id :: SomeArrow a a 

的另一个关键操作是(***)这就好比图表的垂直串联:

(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d) 

你能想到的,将两个图并排放置,组合它们的输入边缘和输出边缘。

所以Arrow通常出现在使用类型有向无环图时。然而,你通常看不到它们的原因是因为大多数人在思维上将图表与无类型和高性能的数据结构联系起来。

+0

假设'ArrowLoop'是图表停止非循环的点? – MathematicalOrchid

+1

这无意中得到了为什么箭头不是非常有用/流行的核心。我们已经有了用于构成事物的'Category',并且Haskell语言中的声明本身就是存在于同一时间(彼此相邻)的事物,因此所有'Arrow'都添加了粘合剂,用于将事物放在一起,并把它们分开。问题是可逆粘合剂只是元组,这是不起作用的。这真是元组的错。想象一下,如果我们用'f a - > f b - > f(a,b)'替换'Applicative'中的'<*>'。 – Cirdec

+0

@MathematicalOrchid Right –