假设我有 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')
所以专攻
->
我们得到:(***) :: (Arrow a) => (b -> c) -> (b' -> c') -> (b, b') -> (c, c')
这很好,除了我们想,无论出于何种原因,将前两个参数作为一对来代替。但这很容易,我们只是不 curry 。
Prelude Control.Arrow> :t uncurry (***)
uncurry (***) :: (Arrow a) => (a b c, a b' c') -> a (b, b') (c, c')
如果你专攻
a
再次,您应该看到您正在寻找的类型签名。
关于haskell - 关于箭头运算符的快速问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200462/