Typed Racket的类型推理如何工作?

时间:2012-10-24 17:53:01

标签: types racket type-inference typed-racket

Typed Racket做什么类型的推断?我在Racket邮件列表上找到了以下代码:

  

Typed Racket类型系统包含许多功能   超越Hindley / Milner风格类型系统所支持的等等   我们不能使用那个推理系统。目前,Typed Racket使用   本地类型推断以推断程序中的许多类型,但是   我们想推断更多 - 这是一个持续的领域   研究

上面的模糊使用术语“本地类型推断”,我也听过“发生打字”使用了很多,但我不确定这些术语是什么意思。

在我看来,Typed Racket目前使用的类型推理系统不必要地弱。这是我的意思的一个例子。以下内容未进行类型检查:

(struct: pt ([x : Real] [y : Real]))

(define (midpoint p1 p2)
  (pt (/ (+ (pt-x p1) (pt-x p2)) 2)
      (/ (+ (pt-y p1) (pt-y p2)) 2)))

您必须使用midpoint明确注释(: midpoint (pt pt -> pt)),否则会收到错误:Type Checker: Expected pt, but got Any in: p1。为什么类型检查器不能从中得出结论p1p2 的类型必须pt?这是Racket实现类型的方式的一个基本限制(即,这个推理线实际上错误有时候,因为一些Racket更高级的类型特性),或者这是可以实现的东西在将来?

1 个答案:

答案 0 :(得分:6)

默认情况下,假设未注释的顶级函数的输入和输出类型为Any。我提供了这个模糊的解释:由于Racket的类型系统是所以灵活,它有时可以推断出你不期望的类型,并允许某些程序在你可能希望它们发出类型错误时进行类型检查。

Tangent:如果适合你的话,你也可以使用define:表格。

(define: (midpoint [p1 : pt] [p2 : pt]) : pt
  ...)