6

私が持っていると言うf :: u -> v -> wg :: x -> y -> z。私が欲しいのはですh :: (u,x) -> (v,y) -> (w,z)

だから私はこれを手動で行うことができます:

h (u,x) (v,y) = (f u v, g x y)

しかし、その楽しみはどこにありますか?

Iを使用(***)すると、途中まで到達できます。

(f *** g) :: (u,x) -> (v -> w, y -> z)

しかし、私はその最後のマイルを取得する方法を理解することはできません。

4

1 に答える 1

13
(***) :: (Arrow a) => a b c -> a b' c' -> a (b, b') (c, c')

したがって、toを専門にする->と、次のようになります。

(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')

そして、それは素晴らしいことです。ただし、何らかの理由で、最初の2つの引数を1つのペアとして代わりに使用したい場合を除きます。しかし、それは簡単です。

Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')

また、もう一度専門にすると、a探していた型アノテーションが表示されるはずです。

于 2011-03-05T00:36:42.967 に答える