首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >辛德雷-米尔纳推理能为围棋语言工作吗?

辛德雷-米尔纳推理能为围棋语言工作吗?
EN

Software Engineering用户
提问于 2016-04-18 12:44:43
回答 1查看 2.8K关注 0票数 22

我读到过辛德雷-米尔纳不适用于具有子类的类型系统,还有其他类型系统特性也不能很好地处理它。Go目前在:=操作符中只有非常有限的类型推断。但是Go没有传统意义上的子类,只有看起来非常像Haskell的类型类的接口,这些类可以很好地与辛德雷-米尔纳推理一起工作。

那么,辛德雷-米尔纳的推理原则上能像哈斯克尔那样起作用吗?还是有其他的功能破坏了它?(另一方面,Haskell也有一些不适用于的特性,如果您使用这些特性,就必须手动键入程序的这些部分。)

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-04-18 13:18:54

辛德雷-米尔纳型推理是对辛德雷-米尔纳型系统的一种限制,是对系统-F型系统的限制.HM型系统有趣的特点是它们具有参数多态性(又名参数多态)。仿制药)。这是戈朗拒绝拥有的单一最大类型的系统功能。

有了这种令人沮丧的限制,HM风格的类型推断是不可能的。让我们看一下非类型化的代码:

代码语言:javascript
复制
func f(a) {
  return a.method()
}

f的类型是什么?我们可能会注意到,a必须有一个方法,所以我们可以使用一个匿名接口:func f(a interface { method() ??? }) ???。但是,我们不知道返回类型是什么。使用类型变量,我们可以将类型声明为

代码语言:javascript
复制
func f[T](a interface{ method() T }) T

但是,Go没有类型变量,所以这是行不通的。虽然隐式接口使类型推断的某些方面更容易,但我们现在无法找到函数调用的返回类型。HM-系统要求声明所有函数,而不是隐含函数,每个名称只能有一个类型(而Go的方法可以在不同的接口中有不同的类型)。

相反,Go要求函数总是完全声明,但允许变量使用类型推断。这是可能的,因为赋值variable := expression的右侧在程序的那个点已经有一个已知的类型。这种类型推理简单、准确、线性。

  • 变量的类型在声明的点立即被知道,而HM推断必须潜在的类型-首先检查整个程序。这对错误消息的质量也有明显的影响。
  • Go的类型推断方法总是为变量选择最特定的类型,而HM则选择最一般的类型。这种方法可以很好地处理子类型,甚至可以用于Go的隐式接口。
票数 34
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/316065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档