मुझे पता है कि यह एक सरल दृष्टिकोण नहीं हो सकता है, लेकिन मैंने कार्यात्मक भाषाओं से "फिक्स" नामक तकनीक के बारे में सीखा । fix
हास्केल से समारोह के रूप में अधिक आम तौर पर जाना जाता है Y Combinator , जो सबसे प्रसिद्ध में से एक है निश्चित बिंदु combinators ।
एक निश्चित बिंदु एक ऐसा मान है जो किसी फ़ंक्शन द्वारा अपरिवर्तित होता है: फ़ंक्शन f का एक निश्चित बिंदु कोई भी x ऐसा x = f (x) है। एक निश्चित बिंदु कॉम्बिनेटर y एक फ़ंक्शन है जो किसी भी फ़ंक्शन f के लिए एक निश्चित बिंदु देता है। चूँकि y (f) f का एक निश्चित बिंदु है, इसलिए हमारे पास y (f) = f (y (f)) है।
अनिवार्य रूप से, वाई कॉम्बिनेटर एक नया फ़ंक्शन बनाता है जो मूल के सभी तर्कों को लेता है, साथ ही एक अतिरिक्त तर्क जो पुनरावर्ती फ़ंक्शन है। यह कैसे काम करता है यह स्पष्ट संकेतन का उपयोग करके अधिक स्पष्ट है। कोष्ठक ( f(x,y,...)
) में तर्क लिखने के बजाय , फ़ंक्शन के बाद उन्हें लिखें f x y ...
:। वाई कॉम्बिनेटर के रूप में परिभाषित किया गया है Y f = f (Y f)
; या, पुनरावर्ती फ़ंक्शन के लिए एकल तर्क के साथ Y f x = f (Y f) x
,।
चूंकि पीएचपी स्वचालित रूप से नहीं करता करी काम करता है, इसे बनाने के लिए एक हैक का एक सा fix
काम है, लेकिन मुझे लगता है कि यह दिलचस्प है।
function fix( $func )
{
return function() use ( $func )
{
$args = func_get_args();
array_unshift( $args, fix($func) );
return call_user_func_array( $func, $args );
};
}
$factorial = function( $func, $n ) {
if ( $n == 1 ) return 1;
return $func( $n - 1 ) * $n;
};
$factorial = fix( $factorial );
print $factorial( 5 );
ध्यान दें कि यह लगभग वही है जो साधारण क्लोजर समाधानों को दूसरों ने पोस्ट किया है, लेकिन फ़ंक्शन fix
आपके लिए क्लोजर बनाता है। निश्चित बिंदु कॉम्बिनेटर एक बंद का उपयोग करने की तुलना में थोड़ा अधिक जटिल हैं, लेकिन अधिक सामान्य हैं, और अन्य उपयोग हैं। जबकि PHP के लिए क्लोजर विधि अधिक उपयुक्त है (जो कि बहुत कार्यात्मक भाषा नहीं है), मूल समस्या उत्पादन के लिए व्यायाम से अधिक है, इसलिए वाई कॉम्बिनेटर एक व्यवहार्य दृष्टिकोण है।
global $factorial
?