Некоторые функции для работы со стрелками очень удобны для использования на парах. Но я не могу понять, как типы этих функций объединяются в пару. В общем, я считаю, что типы функций, связанных со стрелками, довольно запутаны.
Например, у нас есть 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)
Может кто-нибудь объяснить, как это работает?