C++ 向C+解释ML类型推断+;程序员
ML如何在以下函数定义中执行类型推断:C++ 向C+解释ML类型推断+;程序员,c++,functional-programming,templates,type-inference,ml,C++,Functional Programming,Templates,Type Inference,Ml,ML如何在以下函数定义中执行类型推断: let add a b = a + b 是像C++模板,在模板实例化之前没有执行类型检查,如果类型支持必要操作,则函数工作,否则会引发编译错误? i、 例如,以下函数模板 template <typename NumType> NumType add(NumType a, NumType b) { return a + b; } 模板 NumType添加(NumType a、NumType b){ 返回a+b; } 将为 add<
let add a b = a + b
是像C++模板,在模板实例化之前没有执行类型检查,如果类型支持必要操作,则函数工作,否则会引发编译错误?
i、 例如,以下函数模板template <typename NumType>
NumType add(NumType a, NumType b) {
return a + b;
}
模板
NumType添加(NumType a、NumType b){
返回a+b;
}
将为
add<int>(23, 11);
add(23,11);
但对我来说不起作用
add<ostream>(cout, fout);
add(cout,fout);
我猜测的是正确的还是ML类型推断的工作方式不同
PS:对不起,我的英语很差;这不是我的母语。ML使用。在这个简单的例子中,它所要做的就是查看函数体,看看它是否使用带有参数的+
,并返回参数。因此,它可以推断参数必须是+
接受的参数类型(即int),并且函数返回+
返回的类型(也是int)。因此,add
的推断类型是int->int->int
请注意,在SML(但不是CAML)中,
+
也为int以外的其他类型定义,但当存在多种可能性时(即,您定义的add
函数不能用于添加两个浮点值),它仍将推断int。我建议您看看这篇文章:
下面是他们用来解释类型推断的最简单的例子(不是ML,但想法是一样的):
只要看一下bar的定义,我们就可以很容易地看到它的类型必须是(String,Int)=>Int。简而言之,这就是类型推断。阅读整篇文章了解更多信息和示例
<>我不是C++专家,但我认为模板是更接近泛型/参数性的其他东西,这是不同的。<我想把ML类型推理与C++中的几乎任何事物联系起来都比理解更容易引起混乱。C++根本没有任何类似类型推理的东西。 <> C++中唯一不显式打印的部分是模板,但是(大多数情况下)它们支持泛型编程。像您所给出的C++函数模板可能同样适用于一个无界的类型集合——例如,您使用的代码
add
,在一个位置添加两个字符串,在另一个位置添加两个数字
ML类型推断不适用于泛型编程。在C或C++中,显式定义参数的类型,然后编译器检查该类型允许的所有尝试。ML则相反:它查看您使用参数所做的事情,并计算出您必须使用什么类型才能完成这些事情。如果您试图做一些相互矛盾的事情,它会告诉您没有任何类型可以满足约束
<>这在C或C++中是几乎不可能的,主要是因为所有的隐式类型转换都是允许的。例如,如果我在ML中有一些类似于代码> A+B/<代码>的东西,它可以立即得出结论:<代码> A<代码> >代码> B/COD>必须是int型的,但是在C或C++中,它们几乎可以是整数或指针或浮点类型的任意组合(约束它们不能同时是指针)。或者使用重载运算符+
(例如,std::string
)的定义类型。在ML中,在最坏的情况下,查找类型可能是指数型的,但几乎总是非常快。在C++中,我估计它是更频繁的指数,并且在很多情况下可能是受约束的,所以给定函数可以有任意的不同签名。< p> f >和ML在类型推断方面有些相似,因此您可能会发现
有用。您是在询问类型推断还是类型检查?推断。在我的示例中,从ML函数定义推断出什么类型?C++0x使用
auto
关键字进行局部类型推断(与C#类似,但更一般)。当然,这与辛德利·米尔纳的观点相去甚远。基本上,它只在声明点起作用,并且只有当变量立即用常量表达式初始化时才起作用。我不明白的是,为什么a
和b
在fun func(a,b)=a+b
中的类型不会被推断为实
(浮点)。这是因为int
的优先级高于real
?可能是因为s.length
返回int
,我错了吗?
def foo(s: String) = s.length
// note: no explicit types
def bar(x, y) = foo(x) + y