Typed Racket使用哪种类型推断?我在Racket邮件列表中找到了以下代码片段:
“Typed Racket类型系统包含许多超出Hindley / Milner风格类型系统支持范围的功能,因此我们无法使用该推断系统。目前,Typed Racket使用本地类型推断来推断程序中的许多类型,但我们希望推断更多类型-这是一个正在研究的领域。”
上面的文字使用了“本地类型推断”这个术语,我也经常听到“出现类型”这个术语,但我不确定这些术语的确切含义。
在我的看来,Typed 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
。为什么类型检查器不能从中推断出p1
和p2
的类型必须是pt
?这是Racket实现类型的基本限制(即由于一些更高级的类型特性,这种推理方式有时实际上是错误的),还是未来可能实现的内容?