2012-03-21 16 views
5

को फ़ंक्शन की सूची को लागू करने मैं समझता हूँ कि इस योजना में कार्य/नक्शा, foldr, और फिल्टर की तरह रैकेट, तत्वों की सूची के लिए एक समारोह लागू की तरह अच्छी बातें कर सकते हैं।एक संख्या

यह एक एकल तत्व को कार्यों की एक सूची लागू करने के लिए संभव है?

मैं कार्यों में से प्रत्येक के द्वारा उत्पादित मूल्यों उत्पन्न करने के लिए है, तो अपनी अधिकतम खोजने के लिए चाहते हैं। धन्यवाद।

उत्तर

5

पहले भाग के लिए, यह प्रक्रिया एक भी तर्क करने के लिए कार्यों की एक सूची लागू होगा, यह सोचते हैं कि सभी कार्यों के लिए केवल एक तर्क प्राप्त करते हैं। परिणामों के साथ एक सूची

(define (apply-function-list flist element) 
    (map (lambda (f) 
     (f element)) 
     flist)) 

दूसरे भाग के लिए, सूची में अधिकतम खोजना काफी आसान है। उदाहरण के लिए, अगर तत्व 2 है और कार्यों की सूची (list sin cos sqr sqrt) है:

(apply max 
(apply-function-list (list sin cos sqr sqrt) 2)) 

संपादित करें:

यहाँ एक और संभव समाधान है, apply का उपयोग किए बिना और एक ही प्रक्रिया में:

(define (max-list-function flist element) 
    (foldr max -inf.0 
     (map (lambda (f) (f element)) 
       flist))) 

इसे इस तरह प्रयोग करें:

(max-list-function (list sin cos sqr sqrt) 2) 
+1

आह सर धन्यवाद। वह ऐसा करेगा। मैंने हालांकि आवेदन नहीं सीखा है, इसलिए मैं अपने हिस्से पर और अधिक शोध करूँगा। धन्यवाद! –

+0

तर्कों की सूची के साथ फ़ंक्शन को कॉल करने के लिए आवेदन उपयोगी है। तो, उदाहरण के लिए, (लागू करें + (सूची 3 4 5)) 12 उत्पन्न करता है। अक्सर यह मामला लागू होता है जिसे फोल्ड के उपयोग से बदला जा सकता है; इस मामले में, foldr1 या foldl1। यह उन भाषाओं में उपयोगी है जिनके पास 'लागू' नहीं है, क्योंकि फ़ोल्ड 1 और फ़ोल्ड 1 "नियमित" फ़ंक्शन हैं जिन्हें किसी भी भाषा में परिभाषित किया जा सकता है (ठीक है, बस किसी भी भाषा के बारे में)। –

+0

@ जॉन फोल्ड 1 और फ़ोल्ड 1 क्या है? मुझे docs.racket-lang पर उनका संदर्भ नहीं दिख रहा है ... क्या यह srfi/1 की कमी जैसी कुछ है? –

2

एक और चालाक रास्ता एक समारोह को लागू करने के बाद दूसरे के साथ गुना करने के लिए तो जैसे रचना है:

(define functions (list add1 abs list)) 
((foldl compose1 values functions) -5) 
;which reduces to (list (abs (add1 (values -5)))) 
;which reduces to '(4) 
+0

बहुत बढ़िया! मैं काम करने के लिए आवेदन का उपयोग कर अपना खुद का प्राप्त नहीं कर सका, लेकिन यह बहुत अच्छा काम करता है और इसमें बनाया गया है। धन्यवाद! – Greg

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