赋值以外的命令性语句的类型推断


10

在搜寻有关命令式语言的类型系统的研究论文时,我只找到一种具有可变引用但没有真正的命令式控制结构(例如复合运算符,循环或条件)的解决方案。

因此,尚不清楚如何实现具有部分类型推断的命令式语言(例如http://rust-lang.org)

这些论文没有提到参数化类型,例如,List of a因为参数化类型是Hindley-Milner类型系统的琐碎扩展-仅应扩展统一算法,其余推论照原样工作。但是,由于出现了自相矛盾,不能轻易添加分配,因此必须应用诸如ML值限制之类的特殊技术。

您能否推荐描述具有命令性循环,条件,IO和复合语句的语言的类型系统的论文或书籍?


4
我不确定我是否理解您的问题的根源,部分原因是Standard ML实际上具有复合运算符,循环和条件(一行示例:)let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end。因此,在研究问题的层面上,您正在寻找的答案是“应用在Caml / SML中开发的技术,包括价值限制”吗?
罗布·西蒙斯

问题是“您推荐什么有关Caml / SML开发的技术的论文?”
nponeccop 2011年

好的-我已经弄清楚了,打算编辑我​​的最后一句话说:“您正在寻找ML中使用的Hindley-Milner类型推断的可访问引用吗?” 然后我达到了5分钟的编辑限制:-)
Rob Simmons

Answers:


14

如果您正在寻找对类型推断的整洁,功能性的参考,那么我会偏爱Gundry,McBride和McKinna的2010年“ 上下文中的类型推断 ”,尽管这可能并不适合任何实际的现有实现。

我认为答案的一部分是,除了价值限制之外,将Hindley-Milner类型推断适应命令式语言的确没有太大困难:如果您将定义e1; e2为语法糖,(fn _ => e2) e1并且将定义while e1 do e2为语法糖whiledo e1 (fn () => e2)whiledo那么递归函数

fun whiledo g f = if g then (f (); whiledo g f) else ();

那么一切都将正常工作,包括类型推断。

至于价值限制是一种特殊的技巧,我喜欢以下故事。我敢肯定,我是从卡尔·克拉里(Karl Crary)那里捡来的。考虑以下代码,其值限制将阻止您编写ML:

let
   val x: 'a option ref = ref NONE
in
   (x := SOME 5; x := SOME "Hello")  
end

将其与以下代码进行比较,这完全没有问题:

let
   val x: unit -> 'a option ref = fn () => ref NONE
in
   (x () := SOME 5; x () := SOME "Hello")  
end

我们知道第二个示例的作用:它创建两个新的ref单元格,其中包含NONE,然后放入SOME 5第一个(an int option ref),然后放入SOME "Hello"第二个(a string option ref)。

xxα参考选项αxΛα参考[α]没有

这表明第一个示例的一个“良好”行为是与第二个示例的行为完全相同-在不同的时间实例化类型级lambda。第一次实例化xint,它将导致x [int]求值到保存的参考单元格NONE,然后SOME 5。第二次使用实例化xstring,将得出x [string]求(一个不同的)参考单元格的值NONE,然后按SOME "Hello"。这种行为是“正确的”(类型安全的),但是绝对不是程序员所期望的,这就是为什么我们在ML中设置值限制,以避免程序员处理这种意外行为。


1
您的简化版版本e1; e2包含不匹配的括号和分号(应该定义分号)。你是说(fn _ => e2) e1
伊藤刚(Tsuyoshi Ito)

对了,刚:修正。
罗布·西蒙斯

您的最后一段基本上说:(操作)语义和类型系统不匹配,一个需要修复,而我们选择修复后者。
Radu GRIGore

拉杜:当然,我同意那个总结。
罗布·西蒙斯


0

很抱歉取消我自己的问题,但是有问题的参考是

标准ML提案,Milner,1983年

第6部分“标准派生形式”涵盖了命令结构的简化用法。到目前为止,这是我可以找到的这些最明显的转换的最早参考。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.