一些与箭头一起使用的函数在对上使用时非常方便。但我不明白这些函数的类型是如何与一对统一的。一般来说,我发现与箭头相关的函数的类型相当混乱。
例如,我们有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)
有人可以解释一下这是如何工作的吗?