将空列表传递给定义类型:可能吗?

时间:2011-09-19 01:52:09

标签: syntax scheme racket

新秀球拍问题。我正在使用Krishnamurthi的PLAI教科书和相关的Racket编程语言。

现在,让我们说我有一个定义的类型:

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

那么,是否有任何情况可以让我thingy接受空列表'()

2 个答案:

答案 0 :(得分:2)

空列表不是数字,因此您拥有的类型定义将不接受它。

您可以使用(lambda (x) (or (number? x) (null? x)))代替number?接受数字或空列表,但我不知道您为什么要这样做。

答案 1 :(得分:1)

http://docs.racket-lang.org/plai/plai-scheme.html中所述,define-type可以采用几种不同的变体。它可以以允许语言本身帮助您编写更安全代码的方式定义不相交的数据类型。

例如:

#lang plai

(define-type Thingy
 [some (num number?)]
 [none])

与Thingys合作的代码现在需要系统地处理两种可能的Thingys。当你使用type-case时,它将在编译时强制执行:如果它看到你编写的代码没有考虑可能的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)))

这是对的:代码没有考虑到没有的情况。