我读到过辛德雷-米尔纳不适用于具有子类的类型系统,还有其他类型系统特性也不能很好地处理它。Go目前在:=操作符中只有非常有限的类型推断。但是Go没有传统意义上的子类,只有看起来非常像Haskell的类型类的接口,这些类可以很好地与辛德雷-米尔纳推理一起工作。
那么,辛德雷-米尔纳的推理原则上能像哈斯克尔那样起作用吗?还是有其他的功能破坏了它?(另一方面,Haskell也有一些不适用于的特性,如果您使用这些特性,就必须手动键入程序的这些部分。)
发布于 2016-04-18 13:18:54
辛德雷-米尔纳型推理是对辛德雷-米尔纳型系统的一种限制,是对系统-F型系统的限制.HM型系统有趣的特点是它们具有参数多态性(又名参数多态)。仿制药)。这是戈朗拒绝拥有的单一最大类型的系统功能。
有了这种令人沮丧的限制,HM风格的类型推断是不可能的。让我们看一下非类型化的代码:
func f(a) {
return a.method()
}f的类型是什么?我们可能会注意到,a必须有一个方法,所以我们可以使用一个匿名接口:func f(a interface { method() ??? }) ???。但是,我们不知道返回类型是什么。使用类型变量,我们可以将类型声明为
func f[T](a interface{ method() T }) T但是,Go没有类型变量,所以这是行不通的。虽然隐式接口使类型推断的某些方面更容易,但我们现在无法找到函数调用的返回类型。HM-系统要求声明所有函数,而不是隐含函数,每个名称只能有一个类型(而Go的方法可以在不同的接口中有不同的类型)。
相反,Go要求函数总是完全声明,但允许变量使用类型推断。这是可能的,因为赋值variable := expression的右侧在程序的那个点已经有一个已知的类型。这种类型推理简单、准确、线性。
https://softwareengineering.stackexchange.com/questions/316065
复制相似问题