Передача пустого списка определенному типу: возможно? - PullRequest
1 голос
/ 19 сентября 2011

Вопрос о ракетке для новичков. Для этого я использую учебник Кришнамурти по PLAI и связанный с ним язык программирования Racket.

Теперь предположим, что у меня есть определенный тип как таковой:

(define-type Thingy
 [thingy (num number?)])

Итак, есть ли вообще обстоятельства, при которых я мог бы заставить thingy принять пустой список '()?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Пустой список не является числом, поэтому имеющееся у вас определение типа не примет его.

Вы можете использовать (lambda (x) (or (number? x) (null? x))) вместо number?, чтобы принять либо число, либо пустой список, но я понятия не имею, почему вы хотите это сделать.

1 голос
/ 20 сентября 2011

Как описано в 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)))

И это правильно: код не учитывает ни одного случая.

...