1

矢印を操作するための関数のいくつかは、ペアで使用すると非常に便利です。しかし、これらの関数の型がどのようにペアで統一されるのか理解できません。一般に、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)

誰かがこれがどのように機能するか説明してもらえますか?

4

3 に答える 3

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'))

残りはそれに続くはずです。

インスタンスでは常にアロー関数 (特に(***)(&&&))を使用します。の他のインスタンスでこれらのコンビネータを使用することは非常にまれです。したがって、 が表示されるたびに、「(一般化された) 関数 からまで」と考えてください。これは、通常の関数でも機能します。(->)Arrowa b cbc

于 2011-01-27T07:46:55.723 に答える
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)

タプルの未知の 2 番目の型のダミーとして d を使用します。

&&& は、同じ入力を受け取る 2 つの矢印を取り、その入力を受け取る矢印を作成し、それをタプルに複製し、タプルの各部分で矢印の 1 つを実行して、変更されたタプルを返します。

堅実なチュートリアルについては、 http ://www.vex.net/~trebla/haskell/hxt-arrow/lesson-0.xhtml をご覧ください。

于 2011-01-27T06:56:13.300 に答える
1

純粋関数でArrow関数を使用する方法について、このブログ投稿を少し前に行いました

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

私はすべての基本的なArrowメソッドを本当にシンプルで詳細な方法でカバーしようとしています。

乾杯。

于 2011-01-27T17:21:38.340 に答える