我用 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
函数是什么类型呢?