Я написал анонимную факториальную функцию в C++ и скомпилировал свой код с g ++ 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
? Если я просто перевести код C++ в Haskell, он не будет компилироваться, так как она включает в себя бесконечные типы:
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
, но почему g ++ вывести правильный тип моей функции fac? – Alaya
'fac' в этом является общей лямбдой, которая действует как функтор с шаблоном' operator() '. Обратите внимание, что они новы для C++ 14. – user657267