2011-03-04 20 views
6

कहें कि मुझे 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) 

लेकिन मैं समझ नहीं कैसे है कि अंतिम मील मिलता है।

उत्तर

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

तो -> करने के लिए एक विशेषज्ञ और हम पाते हैं:

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

और वह जो भी कारण के लिए, बहुत अच्छा है, सिवाय इसके कि हम चाहते हैं,, बजाय एक ही जोड़ी के रूप में पहले दो तर्क ले। लेकिन यह आसान है, हम सिर्फ uncurry।

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

और अगर आप a फिर विशेषज्ञ, आप प्रकार हस्ताक्षर आप देख रहे थे देखना चाहिए।

+0

धन्यवाद! भविष्य के संदर्भ के लिए gist'd: https://gist.github.com/856956 – rampion

संबंधित मुद्दे