问题 箭怎么样?


通过阅读有关Haskell各种类别主题类的各种教程,我们可以找到类似的东西 MonoidFunctorMonad 等等 - 所有这些都有几十个实例。但出于某种原因,当我们到达时 Arrow,只有两个实例:函数和monad。在这两种情况下,使用 Arrow 实例比直接使用底层事物更不强大,也更困难。

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


5404
2018-04-04 19:37


起源

相应 - bheklilr
可能基于箭头的FRP有资格吗? - Daniel Pratt
我对Haskell中Arrows的理解是,它们或多或少地为您提供了电路语言,其中一个组件取决于前一个组件的输出。你可能会问这与正常的函数组合和组合有什么不同,但是普通函数不能带有额外的上下文和结构,而箭头更抽象而且可以。这就是为什么它们在FRP中很受欢迎,你可以编写看起来很简单且可以非常容易理解的有效代码。它们还用于Hxt库,通过看似纯粹的计算来传输XML数据。 - bheklilr
有一个论点是 Arrow 从Profunctor开始,它自己的“类型层次结构”服务之间是一个相当差的抽象。 - J. Abrahamson


答案:


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


7
2018-04-04 19:54



HXT似乎很有趣。任何评论为什么大多数解析器库是applicative functor(或monad),但这个是箭头? - MathematicalOrchid


我想想 Arrows作为可组合的有向无环图。例如,箭头类型:

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

...您可以将其视为具有三个类型的传入边的图 ab,和 c 和三个类型的传出边 de,和 f

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

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

......在哪里 ab,和 c 可能是他们自己的元组。同样的, id 只是将所有传入边转发到传出边的标识图:

id :: SomeArrow a a

另一个关键操作是 (***) 这就像图的垂直连接:

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

您可以将其视为并排放置两个图形,组合它们的输入边缘和输出边缘。

所以 Arrow 通常在使用类型有向无环图时出现。但是,您通常不会看到它们的原因通常是因为大多数人在心理上将图形与无类型和高性能数据结构相关联。


8
2018-04-05 02:02



想必 ArrowLoop 是图表停止非循环的点? - MathematicalOrchid
这意外地触及了为什么箭头不是非常有用/受欢迎的核心。我们已经有了 Category 对于组成的事物,以及Haskell本身的语言声明同时存在的事物(彼此相邻),所以所有 Arrow 添加是胶水,用于将物品放在一起,并将它们分开。问题是可逆胶水只是元组,它们是不合适的。这真的是元组的错。想象一下,如果我们更换 <*> 在 Applicative 同 f a -> f b -> f (a, b)。 - Cirdec
@MathematicalOrchid对 - Gabriel Gonzalez
@Cirdec确实,我相信有一个证据(某处) Category + Applicative 相当于 Arrow。这是他们没有看到很多用途的另一个原因。 - Gabriel Gonzalez
我找到了证据的一部分, cdsmith.wordpress.com/2011/08/13/...。它需要更多的公理来进行相互作用 Category 和 Applicative,并没有一直显示为任何 Applicative  Category 也是一个 Arrow。 - Cirdec