Как описано в http://docs.racket -lang.org / plai / plai-sche.html , определение типа может принимать несколько различных вариантов.Он может определять непересекающийся тип данных таким образом, чтобы сам язык мог помочь вам написать более безопасный код.
Например:
#lang plai
(define-type Thingy
[some (num number?)]
[none])
Код, который работает с Thingys, теперь должен систематически обрабатыватьдва возможных вида Thingys.Когда вы используете тип-регистр, он будет применять это во время компиляции: если он обнаружит, что вы написали код, который не учитывает возможные виды Thingy, он выдаст ошибку во время компиляции.
;; bad-thingy->string: Thingy -> string
(define (bad-thingy->string t)
(type-case Thingy t
[some (n) (number->string n)]))
Это дает следующую ошибку во время компиляции:
type-case: syntax error; probable cause: you did not include a case for the none variant, or no else-branch was present in: (type-case Thingy t (some (n) (number-> string n)))
И это правильно: код не учитывает ни одного случая.