2011-03-04 42 views
6

假設我有f :: u -> v -> wg :: x -> y -> z。我想要的是h :: (u,x) -> (v,y) -> (w,z)有關Arrow運營商的快速問題

所以,我可以去了解這個手動:

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

哪來的樂趣呢?

使用(***)我可以中途有:

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

但我想不出如何獲取最後一英里。

回答

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,你會看到你要找的類型簽名。

+0

謝謝!以供將來參考:https://gist.github.com/856956 – rampion 2011-03-06 02:16:28