1

一些与箭头一起使用的函数在对上使用时非常方便。但我不明白这些函数的类型是如何与一对统一的。一般来说,我发现与箭头相关的函数的类型相当混乱。

例如,我们有first :: a b c -> a (b, d) (c, d),这对我来说意义不大。但它可以用来增加一对中的第一个数字:

Prelude Control.Arrow> :t first (+1)
first (+1) :: (Num b) => (b, d) -> (b, d)

Prelude Control.Arrow> :t (&&&)
(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c, c')

Prelude Control.Arrow> :t (pred &&& succ)
(pred &&& succ) :: (Enum b) => b -> (b, b)

有人可以解释一下这是如何工作的吗?

4

3 回答 3

2

第一个箭头采用普通箭头,并将其更改为对元组中的第一个元素执行操作,并将结果作为箭头输出

a b c -> a (b, d) (c, d)

a b c -- is the input arrow, an operation that maps type b to c
a (b, d) (c, d) -- is the output arrow, an operation that maps a tuple (b, d) to (c, d)

它使用 d 作为元组中未知的第二种类型的虚拟对象

&&& 接受两个接受相同输入的箭头并创建一个接受该输入的箭头,将其复制到一个元组中并在元组的每个部分上运行其中一个箭头,返回更改后的元组。

对于一些可靠的教程,请查看: http ://www.vex.net/~trebla/haskell/hxt-arrow/lesson-0.xhtml

于 2011-01-27T06:56:13.300 回答
2

有一个实例Arrow (->)。所以

(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c,c')

有实例化

(&&&) :: (->) b c -> (->) b c' -> (->) b (c,c')

或者,用更传统的符号书写,

(&&&) :: (b -> c) -> (b -> c') -> (b -> (c,c'))

其余的应该从那开始。

我一直在实例上使用箭头函数(尤其是(***)and (&&&)) 。我将这些组合器用于任何其他实例的情况非常罕见。因此,每当您看到 时,请考虑“(generalized) function from to ”,它也适用于常规函数。(->)Arrowa b cbc

于 2011-01-27T07:46:55.723 回答
1

不久前我写了一篇关于如何在纯函数上使用箭头函数的博文

http://blog.romanandreg.com/post/2755301358/on-how-haskells-are-just-might-just-be-function

我尝试以非常简单和详细的方式涵盖所有基本的 Arrow 方法。

干杯。

于 2011-01-27T17:21:38.340 回答