Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 箭呢?_Haskell - Fatal编程技术网

Haskell 箭呢?

Haskell 箭呢?,haskell,Haskell,通过阅读Haskell的各种类别主题类的教程,我们可以发现类似于Monoid、Functor、Monad等等的内容,所有这些都有几十个实例。但由于某种原因,当我们到达箭头时,只有两个实例:函数和单子。在这两种情况下,使用箭头实例比直接使用底层对象功能更弱、难度更大 有人有箭的有趣例子吗?我相信一定有一些,但我从来没有见过任何关于它们的文章…,一个用于解析XML的库,是使用箭头的一个很好的例子(看看这个包的模块名中有多少次出现Arrow)。您将看到精彩的教程: 但是对于函数来说,有箭头的概念也是很

通过阅读Haskell的各种类别主题类的教程,我们可以发现类似于
Monoid
Functor
Monad
等等的内容,所有这些都有几十个实例。但由于某种原因,当我们到达
箭头时,只有两个实例:函数和单子。在这两种情况下,使用
箭头
实例比直接使用底层对象功能更弱、难度更大

有人有箭的有趣例子吗?我相信一定有一些,但我从来没有见过任何关于它们的文章…

,一个用于解析XML的库,是使用箭头的一个很好的例子(看看这个包的模块名中有多少次出现
Arrow
)。您将看到精彩的教程:

但是对于函数来说,有箭头的概念也是很好的。例如,下面的代码

((+1) &&& (*2)) 3 -- result is (4,6)
因为
(>)
是arrow类的一个实例(操作符
&&&&
在中定义)


多亏了这个工具,您还可以用Haskell编写复杂的计算(它也适用于HXT中的函数、单子和XML过滤器)。

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

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
。然而,你通常看不到它们的原因通常是因为大多数人在心理上将图形与非类型化和高性能的数据结构联系起来。

基于箭头的FRP是否合格?我对Haskell中箭头的理解是,它们或多或少给了你电路的语言,其中一个组件取决于前一个组件的输出。您可能会问,这与普通函数的合成和组合有何不同,但普通函数不能携带额外的上下文和结构,而箭头更抽象,可以。这就是为什么它们在FRP中非常流行的原因,您可以编写有效的代码,这些代码看起来很纯净,并且可以很容易地进行推理。Hxt库中也使用它们通过看似纯粹的计算来流式传输XML数据。有一种观点认为,
Arrow
是一个相当糟糕的抽象,由它自己的“类型类层次结构”提供服务从Profunctor开始。大概
ArrowLoop
是图形停止非循环的点吗?这意外地触及了为什么箭头不是非常有用/流行的核心。我们已经为组成的事物提供了
类别
,而Haskell语言本身也为同时存在的事物(彼此相邻)提供了声明,因此所有
箭头
添加的都是胶水,用于将事物彼此相邻地放在一起,然后将它们拆开。问题是可逆胶水只是元组,这是不合适的。这真的是元组的错。想象一下,如果我们用
fa->fb->f(a,b)
@MathematicalOrchid替换
Applicative
中的
Right@Cirdec事实上,我相信(在某处)有一个证据证明,
Category
+
Applicative
等同于
Arrow
。这是另一个他们看不到很多用处的原因。我找到了一部分证据。对于
类别
应用程序
的交互,它需要更多的公理,并且不能完全说明对于任何
应用程序
而言,类别
也是一个
箭头
。HXT似乎很有趣。关于为什么大多数解析器库都是应用程序函子(或单子)的任何评论,但这是一个箭头?