2013-02-18 17 views
6

मान लीजिए मेरे पास दो फ़ंक्शन हैं, f:X->Y और g:Y*Y->Z। मैं एक तीसरा कार्य करना चाहता हूं, h(a, b) = g(f(a), f(b))चेनिंग बहु-पैरामीटर फ़ंक्शन

h a b = g (f a) (f b) 

वहाँ किसी भी तरह से यह h(a, b) = g*f (a, b) की तरह लिखने के लिए है?

और क्या h(a,b,c,d) = g2*g1*f2*f1 (a,b,c,d), जहां g_i 2 तर्क लेते हैं?

+0

अपने दो उदाहरण सिंक्रनाइज़ेशन से बाहर कर रहे हैं। पहला 'जी (एफ 1 ए) (एफ 2 बी) 'या दूसरा' जी (एफ ए) (एफ बी) (एफ सी) (एफ डी) 'होना चाहिए। –

+0

आप 'h = \ a b -> g (f a) (f b)' 'h = (। F) के रूप में लिख सकते हैं। जी एफ', लेकिन आपको (पठनीयता) नहीं करना चाहिए। –

+0

आपके नए दूसरे उदाहरण में, आपका मतलब है 'एफ' फ़ंक्शन 'arg' ले रहा है, और 'g' funcs 2 ले रहा है? फिर आपको तीसरे स्तर की आवश्यकता है। क्या आप इसे पूरी तरह से लिख सकते हैं? –

उत्तर

10

right signature के साथ कार्यों के लिए होगल खोजना डेटा सेक्शन on दिखाता है। इसके प्रलेखन के अनुसार,

g `on` f 

ऐसा लगता है कि आप क्या चाहते हैं।

7

on Combinator (Data.Function में, के रूप में एक और उत्तर में GSPR से कहा)

g `on` f = \x y -> g (f x) (f y) 

द्वारा परिभाषित किया गया है जो तुम लिखने के लिए

h = g `on` f 

आप उच्च आयामी सामान्यीकरण कर सकते हैं अनुमति होगी इनमें से, उदाहरण के लिए

g `on3` f = \x y z -> g (f x) (f y) (f z) 

g `on4` f = \w x y z -> g (f w) (f x) (f y) (f z) 

ताकि आप लिख सकते हैं

h = g `on3` f 

एक तरह से on के मामले में on3 और on4 लिखने के लिए हो सकता है, लेकिन अगर वहाँ मैं इसे इस समय नहीं देख सकता।

6

आप तीरों को भी दिलचस्प पाते हैं।

h g f a b = uncurry g ((f *** f) (a, b)) 

कौन सा अपने उदाहरण के बराबर है (सिवाय इसके कि g और f मुक्त नहीं हैं) और on: यहाँ एक तरह से यह करने के लिए है।का उपयोग करना:

  • *** की definition कार्यों के लिए:

    uncurry की
    (***) f g ~(x,y) = (f x, g y) 
    
  • definition:

    uncurry f p = f (fst p) (snd p) 
    

और उनमें मूल समीकरण में स्थानापन्न:

  1. h g f a b = uncurry g (f a, f b)(*** परिभाषा का इस्तेमाल किया)

  2. h g f a b = g (f a) (f b)(इस्तेमाल किया uncurry परिभाषा)