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
でしょうか?