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

ts-guide说:

In addition to the : form, almost all binding forms from racket have counterparts which allow the specification of types.

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

ts-reference表示形式:是遗留的,为了向后兼容.

但是在ts-guide中,形式:在很多地方使用.

所以:v t优于形式:?
形式怎么样?

例如:

; 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)

最佳答案 第一表格

第一种形式使用特殊形式定义:它以及以下结尾的其他形式:在当前版本的Racket中是legacy forms(在本回答时为v 6.1.1).它等同于键入/球拍的定义,但不接受第二种形式.它可用于向后兼容.

第二表格

第二种形式更接近地反映了函数签名的概念,如How to Design Programs*号书中designing functions的流程所述.更好的是,因为打字/球拍允许写作

(: id (Number . -> . Number) 

使用reader’s infix macro,我们可以以一些额外字符的价格与如何设计程序进行更接近的对应.

第三表格

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

> ((lambda ((x : Number)) : Number (+ x 10)) 4)
- : Number
14 

关于类型推断的备注

请注意,typed / racket具有类型推断,并且没有必要指定返回类型,如:

> ((lambda ((x : Number))(+ x 10)) 4)
- : Number
14

事实上,如果没有指定类型,则键入/球拍将始终最好推断类型:

> ((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

结论

当然,什么类型/球拍推断可能不是程序员所期望的.使用第二种形式的优点是使程序员的意图明确,并使程序员的意图明确是如何设计程序的核心原则,并且首先是开发打字/球拍的动机的核心.

点赞