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)
答案 0 :(得分:1)
但它没有说何时使用哪一个。
在大多数情况下,它们是等效的。
我喜欢第二种形式 - 它可以很容易地再次删除TR注释。
答案 1 :(得分:1)
第一种表单使用特殊格式define:
。在当前版本的Racket中,它以及以:
结尾的其他形式为legacy forms(在此答案时 v 6.1.1 )。它相当于typed/racket
的{{1}},但不接受第二种形式。它可用于向后兼容。
第二种形式更接近于书中designing functions中How 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
的动机的核心。第一名。