मैंने सी ++ में एक अज्ञात फैक्टोरियल फ़ंक्शन लिखा और जी ++ 4.9.2 के साथ अपना कोड संकलित किया। यह अच्छी तरह से काम करता है। हालांकि, मुझे अपने फ़ंक्शन के प्रकार को नहीं पता है।इस स्व-आवेदनशील फैक्टोरियल फ़ंक्शन का प्रकार क्या है?
#include<iostream>
#include<functional>
using std::function;
int main()
{
//tested at g++ 4.9.2
//g++ -std=c++1y -o anony anony.cpp
auto fac = [](auto self,auto n)->auto{
if(n < 1)
return 1;
else
return n * self(self,n-1);
};
std::cout<<fac(fac,3)<<std::endl;//6
return 0;
}
तो, मुझे आश्चर्य है: क्या fac
और self
के प्रकार हैं? अगर मैं सिर्फ हास्केल में सी ++ कोड का अनुवाद है, यह संकलन नहीं करेगा क्योंकि यह अनंत प्रकार शामिल है:
fac2 self 0 = 1
fac2 self n = n * (self self $ n-1)
और मैं इसे आसपास कुछ पुनरावर्ती प्रकार काम को परिभाषित करने के लिए है:
data Y a = Y ((Y a)->a->a)
fac2 self 0 = 1
fac2 self n = n * ((applY self self) (n-1))
where applY (Y f1) f2 = f1 f2
fact2 = fac2 $ Y fac2
तो , g ++ को fac
फ़ंक्शन का सही प्रकार क्यों मिल सकता है, और g ++ किस प्रकार fac
फ़ंक्शन लगता है?
जब आप कुछ प्रकार के साथ 'auto' को प्रतिस्थापित करते हैं उदा। 'int' कंपाइलर आपको बताएगा कि यह प्रकारों का अनुमान नहीं लगा सकता है और उन्हें नाम दे सकता है। लेकिन मैंने इसका परीक्षण नहीं किया है – janisz
लेकिन जी ++ मेरे फंक्शन फ़ंक्शन के सही प्रकार का अनुमान क्यों लगा सकता है? – Alaya
'fac' में यह एक सामान्य लैम्ब्डा है, जो एक टेम्पलेट' ऑपरेटर() 'के साथ एक मजेदार की तरह कार्य करता है। ध्यान दें कि ये सी ++ 14 के लिए नए हैं। – user657267