Reorganize documentation for -> form in TR

Put examples next to relevant prose, add more examples,
and add more cross-references.
This commit is contained in:
Asumu Takikawa 2014-02-13 13:19:55 -05:00
parent 86bca7b6e7
commit 6ad1af3741
3 changed files with 45 additions and 21 deletions

View File

@ -51,7 +51,7 @@ have based on a predicate check in a conditional expression, it can
narrow the type of the variable within the appropriate branch of the
conditional.
@section{Filters and Predicates}
@section[#:tag "filters-and-predicates"]{Filters and Predicates}
In the previous section, we demonstrated that a Typed Racket programmer
can take advantage of occurrence typing to type-check functions

View File

@ -499,33 +499,52 @@ functions and continuation mark functions.
(dom -> rng : pred)]
([ooo #,(racket ...)]
[dom type
(code:line keyword type)
[keyword type]])]{
mandatory-kw
optional-kw]
[mandatory-kw (code:line keyword type)]
[optional-kw [keyword type]])]{
The type of functions from the (possibly-empty)
sequence @racket[dom ...] to the @racket[rng] type. The second form
specifies a uniform rest argument of type @racket[rest], and the
sequence @racket[dom ....] to the @racket[rng] type.
@ex[(λ: ([x : Number]) x)
(λ: () 'hello)]
The second form specifies a uniform rest argument of type @racket[rest], and the
third form specifies a non-uniform rest argument of type
@racket[rest] with bound @racket[bound]. In the third form, the
@racket[...] introduced by @racket[ooo] is literal, and @racket[bound]
must be an identifier denoting a type variable. In the fourth form,
there must be only one @racket[dom] and @racket[pred] is the type
checked by the predicate. @racket[dom] can include both mandatory and
optional keyword arguments.
@racket[rest] with bound @racket[bound]. The bound refers to the type variable
that is in scope within the rest argument type.
@ex[(λ: ([x : Number] . [y : String *]) (length y))
ormap]
In the third form, the @racket[...] introduced by @racket[ooo] is literal,
and @racket[bound] must be an identifier denoting a type variable.
In the fourth form, there must be only one @racket[dom] and @racket[pred] is the type
checked by the predicate. The type @racket[pred] is known as a @emph{filter} for
the function type (for an introduction to filters, see
@tr-guide-secref["filters-and-predicates"]).
@ex[string?]
The @racket[dom]s can include both mandatory and optional keyword arguments.
Mandatory keyword arguments are a pair of keyword and type, while optional
arguments are surrounded by a pair of parentheses.
@ex[(:print-type file->string)
(: is-zero? : (-> Number #:equality (-> Number Number Any) [#:zero Number] Any))
(define (is-zero? n #:equality equality #:zero [zero 0])
(equality n zero))
(is-zero? 2 #:equality =)
(is-zero? 2 #:equality eq? #:zero 2.0)]
The type of functions can also be specified with an @emph{infix} @racket[->]
which comes immediately before the @racket[rng] type. The fifth through
eighth forms match the first four cases, but with the infix style of arrow.
@ex[(λ: ([x : Number]) x)
(λ: ([x : Number] . [y : String *]) (length y))
ormap
string?
(:print-type file->string)
(: is-zero? : Number #:equality (Number Number -> Any) [#:zero Number] -> Any)
(define (is-zero? n #:equality equality #:zero [zero 0])
(equality n zero))
(is-zero? 2 #:equality =)
(is-zero? 2 #:equality eq? #:zero 2.0)]}
@ex[(: add2 (Number -> Number))
(define (add2 n) (+ n 2))]
}
@;; This is a trick to get a reference to ->* in another manual
@(module id-holder racket/base

View File

@ -10,6 +10,11 @@
(define (rtech . x)
(apply tech x #:doc '(lib "scribblings/reference/reference.scrbl")))
(define (tr-guide-secref tag)
(secref tag #:doc '(lib "typed-racket/scribblings/ts-guide.scrbl")))
(define (tr-reference-secref tag)
(secref tag #:doc '(lib "typed-racket/scribblings/ts-reference.scrbl")))
(define ** (let ([* #f]) @racket[*]))
(define-syntax-rule (annvar x t)