关于Arrow运算符的快速问题

时间:2011-03-04 23:35:36

标签: haskell arrows

说我有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)

但那里的乐趣在哪里?

使用(***)我可以在那里中途:

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

但我无法弄清楚如何最后一英里。

1 个答案:

答案 0 :(得分:13)

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

专门研究->,我们得到:

(***) :: (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,您应该会看到您正在寻找的类型签名。