何时在Typed Racket中使用`form:`?

时间:2015-01-06 09:17:38

标签: annotations racket legacy typed-racket

ts-guide说:

  

除了:形式之外,几乎所有来自球拍的绑定形式都有对应物,允许指定类型。

但它没有说何时使用哪一个。

并且ts-reference表示form:是遗留的,以便向后兼容。

但是在ts-guide中,很多地方都使用form:

: v t优先于form:? 那么form呢?

例如:

; form:
(define: (id [z : Number]) : Number z)

; : v t + form
(: id (-> Number Number))
(define (id z) z)

; form (it seems recent versions of Racket add this?)
(define (id [z : Number]) : Number z)

2 个答案:

答案 0 :(得分:1)

  

但它没有说何时使用哪一个。

在大多数情况下,它们是等效的。

我喜欢第二种形式 - 它可以很容易地再次删除TR注释。

答案 1 :(得分:1)

第一表格

第一种表单使用特殊格式define:。在当前版本的Racket中,它以及以:结尾的其他形式为legacy forms(在此答案时 v 6.1.1 )。它相当于typed/racket的{​​{1}},但不接受第二种形式。它可用于向后兼容。

第二表格

第二种形式更接近于书中designing functionsHow to Design Programs*的流程中所述的功能签名的概念。更好的是,因为define允许写

typed/racket

使用reader's infix macro,我们可以以更多字符的价格与如何设计程序进行更密切的对应。

第三表格

第三种形式在静态类型语言方面更传统......我的意思是它更接近地映射到C语言,Java,ML等。它也更通用,因为它可以用在匿名函数中:

(: id (Number . -> . Number) 

关于类型推断的备注

请注意,> ((lambda ((x : Number)) : Number (+ x 10)) 4) - : Number 14 具有类型推断,并且没有必要指定返回类型,如下所示:

typed/racket

如果没有指定类型,> ((lambda ((x : Number))(+ x 10)) 4) - : Number 14 总是最好推断类型:

typed/racket

结论

当然,> ((lambda (x)(+ x 10)) 4) - : Integer [more precisely: Positive-Index] 14 > ((lambda (x)(+ x 10)) 4.0) - : Flonum [more precisely: Positive-Flonum] 14.0 > ((lambda (x)(+ x 10)) 4/1) - : Integer [more precisely: Positive-Index] 14 推断可能不是程序员所期望的。使用第二种形式的优点是使程序员的意图明确,并使程序员的意图明确是如何设计程序的核心原则,并且是开发typed/racket的动机的核心。第一名。