Napisałem anonimową funkcję czynnikową w C++ i skompilowałem mój kod za pomocą g ++ 4.9.2. To działa dobrze. Jednak nie znam typu mojej funkcji.Jaki jest typ tej samoczynnej funkcji silni?
#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;
}
Tak, zastanawiam się: jakie są rodzaje fac
i self
? Gdybym tylko przetłumaczyć kod C++ do Haskell, nie będzie skompilować ponieważ wiąże się nieskończone rodzaje:
fac2 self 0 = 1
fac2 self n = n * (self self $ n-1)
i muszę zdefiniować pewne rekurencyjnej pracy typ wokół niego:
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
Tak , dlaczego g ++ może uzyskać dokładnie odpowiedni typ funkcji fac
, a jaki typ g ++ jest funkcją fac
?
po zastąpieniu 'auto' jakimś typem, np. Kompilator 'int' powinien powiedzieć, że nie może wywnioskować typów i nadać im nazw. Ale nie przetestowałem tego – janisz
, ale dlaczego g ++ może wyprowadzić odpowiedni typ funkcji mojego fac? – Alaya
'fac' w tym jest ogólna lambda, która działa jak funktor z szablonem' operator() '. Zauważ, że są nowe dla C++ 14. – user657267