c++ - 向 C++ 程序员解释 ML 类型推断

标签 c++ functional-programming templates type-inference ml

ML 如何在以下函数定义中执行类型推断:

let add a b = a + b

它是否像 C++ 模板一样,在模板实例化之前不执行类型检查,之后如果类型支持必要的操作,函数就可以工作,否则会抛出编译错误?

即例如下面的函数模板

template <typename NumType>
NumType add(NumType a, NumType b) {
  return a + b;
}

将工作于

add<int>(23, 11);

但不适用于

add<ostream>(cout, fout);

我的猜测是正确的还是 ML 类型推断的工作方式不同?

PS:抱歉我的英语不好;这不是我的母语。

最佳答案

我建议你看看这篇文章:What is Hindley-Milner? (and why is it cool)

这是他们用来解释类型推断的最简单的例子(不是机器学习,但思路是一样的):

def foo(s: String) = s.length
// note: no explicit types
def bar(x, y) = foo(x) + y

只看bar的定义,我们很容易看出它的类型一定是(String, Int)=>Int。简而言之,这就是类型推断。阅读整篇文章以获取更多信息和示例。

我不是 C++ 专家,但我认为模板是更接近通用性/参数化的东西,这是不同的东西。

关于c++ - 向 C++ 程序员解释 ML 类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677990/

相关文章:

c++ - 通过第一个元素推断初始值设定项列表的类型

r - 名称对应于现有函数名称的函数参数的默认值

c++ - 模板类中的静态常量类型

c++ - 模板类友元函数的内部类

algorithm - 梯度下降算法在 Haskell 中不收敛

c++ - 模板函数重载歧义

c++ - 缩放时保持 QGraphicsSimpleTextItem 居中

c++ - 对类构造函数的 undefined reference

c++ - 默认模板参数编译器错误

syntax - F# 中 Item 属性的类型