2011-11-19 11 views
7

में एक लैम्ब्डा समारोह पुनर्प्रयोग मैं कर रहा हूँ चाहिए इस कोड को लेने के लिए:हास्केल

f x y z = x^3 - g (x + g (y - g z) + g (z^2)) 
where g x = 2*x^2 + 10*x + 1 

और बिना जहां यह फिर से लिखने (या नहीं)।

वे एक लैम्ब्डा समारोह के साथ इसे लिखने के लिए मतलब (\ एक्स -> ...)

मैं हास्केल पर एक लैम्ब्डा समारोह का पुन: उपयोग करने के लिए कोशिश कर रहा हूँ। कोई विचार?

+6

'एफ = फ्लिप फ्लिप ((1 +) एपी ((+)। (2 *)। (^ 2)) (10 *))। (फ्लिप।)। एपी ((।)। (।)। (।)। (-)। (^ 3)) (((एपी आईडी।)।) फ्लिप फ्लिप (फ्लिप आईडी। (^ 2))। (लिफ्टएम 2 (लिफ्टएम 2 (+))।)। (। ((एपी आईडी।)। (। फ्लिप आईडी)। (।)। (-)))। (।)। (।)। (+)) ': f lambdabot द्वारा व्यर्थ बना दिया गया – fuz

उत्तर

12
पर

bravit संकेत के रूप में, आप निम्नलिखित तरीके से एक लैम्ब्डा का उपयोग कर एक गैर पुनरावर्ती let पुनर्लेखन कर सकते हैं:

let x = A in B  ==>  (\x -> B) A 

जहां x एक चर रहा है और A और B अभिव्यक्तियां हैं। दूसरी तरह एक बड़ा सौदा दिखेगा जो की अन्य जिनमें से एक g की तरह एक महान सौदा दिखाई देता रहेगा और -

+5

मुझे इस बात के बारे में मजाकिया बात यह है कि यह वास्तव में जावास्क्रिप्ट में एक मानक अभ्यास है चूंकि केवल फ़ंक्शन वहां एक स्कोप ब्लॉक पेश कर सकते हैं। – hugomg

+1

मुझे अभी भी यकीन नहीं है कि मैं समझता हूं कि इसे कैसे उपयोग किया जा सकता है – Asaf

+0

@Asaf: आप 'बी' में कई बार 'x' का उल्लेख कर सकते हैं। उदाहरण के लिए, '(\ x -> x + x) 3' लें। यह '3 + 3' के बराबर है, सिवाय इसके कि आपको केवल एक बार '3' लिखना पड़ेगा। – hammar

8

कुछ का पुन: उपयोग करने के लिए आप इसे किसी चीज़ के लिए तर्क दे सकते हैं।

2

मुझे लगता है कि इरादा यह है कि ब्रितिट संकेत क्या है।
होनहार व्यक्ति का पालन-पत्र के-कानून तरीके को एक case साथ g बाध्यकारी है;)

+2

एक और स्मार्टपैंट समाधान 'जी' को शीर्ष-स्तरीय फ़ंक्शन बनाने के लिए होगा, क्योंकि यह 'f' से कुछ भी बंद नहीं करता है :) – hammar

2

Hammar की और bravit के संकेत पर विस्तार करने के लिए, अपने समाधान सिर्फ एक नहीं लैम्ब्डा, लेकिन दो की आवश्यकता के लिए जा रहा है f

1

लैम्ब्डा पथरी g का उपयोग के आधे (\x -> 2*x^2 + 10*x + 1)

तो तुम f x y z = x^3 - g (x + g (y - g z) + g (z^2))

$> echo "f x y z = x^3 - g (x + g (y - g z) + g (z^2))" | sed -r -e 's/g/(\\x -> 2*x^2 + 10*x + 1)/g' 
f x y z = x^3 - (\x -> 2*x^2 + 10*x + 1) (x + (\x -> 2*x^2 + 10*x + 1) (y - (\x -> 2*x^2 + 10*x + 1) z) + (\x -> 2*x^2 + 10*x + 1) (z^2)) 

में उस के साथ जी स्थानापन्न करने की जरूरत है मैं कर रहा हूँ बस मजाक कर, क्षमा करें।

+3

मुझे यकीन है कि उसके प्रशिक्षक उस उत्तर के बारे में उत्साहित होंगे;) – Nate

+1

यह वही जवाब है जो मैं दूंगा। जहां तक ​​मुझे पता है, सवाल यह है कि "यहां बेवकूफ कोड लें और इसे और भी खराब बनाएं, साबित करने के लिए कि आप एक्स जानते हैं"। यदि शिक्षक जांचना चाहता है कि क्या मुझे एक्स पता है, तो उन्हें एक सवाल उठाना चाहिए जहां एक्स वास्तव में उपयोगी/आवश्यक है। –

-1

यह प्रश्न मेरे लिए उत्सुक और दिलचस्प लगता है। इसलिए, मैं यह पता लगाने की कोशिश कर रहा हूं कि लैम्ब्डा कैलकुस क्या है, एक उत्तर ढूंढें और इसे ओपी को दिखाना चाहते हैं (सभी संकेतों को वास्तव में दिखाया गया है, स्पूइलर अलर्ट)।

λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) 
f :: 
    (Integer -> Integer) -> Integer -> Integer -> Integer -> Integer 

समारोह तो, हम मिल गया है, जो समारोह और 3 नंबर प्राप्त और जवाब देते हैं:

सबसे पहले, f को फिर से परिभाषित करने की कोशिश कर सकते हैं। curring हम यहीं g परिभाषा जोड़ सकते हैं f_new = f g की तरह, का उपयोग करना:

λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1) 
f :: Integer -> Integer -> Integer -> Integer 

हम काम हो गया। आइए इसे जांचें:

λ> f 0 0 0 
-13 

उत्तर सही है।

युपीडी:

उन उदाहरण let में सिर्फ एक दुभाषिया में समारोह की घोषणा करने के लिए रास्ता है, इसलिए अंतिम जवाब है:।

f :: Num a => a -> a -> a -> a 
f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)