C++ 向C+解释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<

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<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++函数模板可能同样适用于一个无界的类型集合——例如,您使用的代码 NoMyth>代码>作为模板参数,但将使用字符串。单个程序可以实例化您的
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