Haskell 关于箭头操作符的快速问题

Haskell 关于箭头操作符的快速问题,haskell,arrows,Haskell,Arrows,假设我有f::u->v->w和g::x->y->z。我想要的是h::(u,x)->(v,y)->(w,z) 因此,我可以手动执行此操作: h (u,x) (v,y) = (f u v, g x y) 但这其中的乐趣何在 使用(***)我可以中途到达: (f *** g) :: (u,x) -> (v -> w, y -> z) 但我不知道如何跑完最后一英里 (***) :: (Arrow a) => a b c -> a b' c' -> a (b, b'

假设我有
f::u->v->w
g::x->y->z
。我想要的是
h::(u,x)->(v,y)->(w,z)

因此,我可以手动执行此操作:

h (u,x) (v,y) = (f u v, g x y)
但这其中的乐趣何在

使用
(***)
我可以中途到达:

(f *** g) :: (u,x) -> (v -> w, y -> z)
但我不知道如何跑完最后一英里

(***) :: (Arrow a) => a b c -> a b' c' -> a (b, b') (c, c')
因此,将a专门化为
->
,我们得到:

(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')
这很好,除了出于任何原因,我们想把前两个参数作为一对。但那很容易,我们只是没有结婚

Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')
如果您再次专门化
a
,您应该会看到您正在寻找的类型签名