Ho scritto una funzione fattoriale anonima in C++ e ho compilato il mio codice con g ++ 4.9.2. Funziona bene. Tuttavia, non conosco il tipo della mia funzione.Qual è il tipo di questa funzione fattoriale auto-applicante?
#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;
}
Quindi, mi chiedo: quali sono i tipi di fac
e self
? Se ho appena tradurre il codice C++ in Haskell, non si compila perché si tratta di infiniti tipi:
fac2 self 0 = 1
fac2 self n = n * (self self $ n-1)
e devo definire un certo tipo di lavoro ricorsivo intorno ad esso:
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
Così , perché g ++ può ottenere esattamente il tipo giusto della funzione fac
e che tipo pensa g ++ la funzione fac
?
quando si sostituisce 'auto' con un certo tipo, ad es. Il compilatore '' t' dovrebbe dirti che non può dedurre i tipi e dare loro i nomi. Ma non l'ho testato – janisz
ma perché potrebbe g ++ dedurre il giusto tipo della mia funzione fac? – Alaya
'fac' in questo è un lambda generico, che agisce come un funtore con un operatore di template()'. Si noti che questi sono nuovi per C++ 14. – user657267