矢印を操作するための関数のいくつかは、ペアで使用すると非常に便利です。しかし、これらの関数の型がどのようにペアで統一されるのか理解できません。一般に、Arrow 関連の関数の型は非常にわかりにくいと思います。
たとえば、私に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)
誰かがこれがどのように機能するか説明してもらえますか?