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