Я написал анонимную факториальную функцию в С++ и скомпилировал свой код с 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
?
Если я просто переведю код С++ в 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
?