一个菜鸟球拍的问题。我使用Krishnamurthi的PLAI教科书和相关的Racket编程语言。将空列表传递给定义类型:可能吗?
现在,让我们说,我有一个定义的类型为这样:
(define-type Thingy
[thingy (num number?)])
那么,有没有任何情况下都下我能得到这个thingy
接受空单'()
?
一个菜鸟球拍的问题。我使用Krishnamurthi的PLAI教科书和相关的Racket编程语言。将空列表传递给定义类型:可能吗?
现在,让我们说,我有一个定义的类型为这样:
(define-type Thingy
[thingy (num number?)])
那么,有没有任何情况下都下我能得到这个thingy
接受空单'()
?
空的列表不是一个数字,所以你有的类型定义将不会接受它。
您可以使用(lambda (x) (or (number? x) (null? x)))
而不是number?
来接受一个数字或一个空列表,但我不知道为什么要这样做。
如http://docs.racket-lang.org/plai/plai-scheme.html中所述,define-type可以采用几种不同的变体。它可以定义一种不相交的数据类型,使语言本身可以帮助您编写更安全的代码。
例如:
与Thingys现在的工作需要系统处理两种可能Thingys的#lang plai
(define-type Thingy
[some (num number?)]
[none])
代码。当你使用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)))
这是正确的:代码没有占到没有的情况。
谢谢,这有助于很多:) 您的整理评论:返回Schemers皱起眉头的空列表的行为?我只是这样做,以涵盖一个微不足道的案例,顺便说一句。 – arkate
好吧,如果你的函数通常返回一堆物品的列表,并且你正在返回一堆空的物品,那么一个空列表是适当的。你在说什么“微不足道的事情”? –
Scheme并没有真正的“null”概念(就像Java和类似的语言一样),所以如果你的程序依赖于这样一个概念,那么你应该重新考虑你的设计。 –