2011-09-19 56 views
1

一个菜鸟球拍的问题。我使用Krishnamurthi的PLAI教科书和相关的Racket编程语言。将空列表传递给定义类型:可能吗?

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

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

那么,有没有任何情况下都下我能得到这个thingy接受空单'()

回答

2

空的列表不是一个数字,所以你有的类型定义将不会接受它。

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

+0

谢谢,这有助于很多:) 您的整理评论:返回Schemers皱起眉头的空列表的行为?我只是这样做,以涵盖一个微不足道的案例,顺便说一句。 – arkate

+0

好吧,如果你的函数通常返回一堆物品的列表,并且你正在返回一堆空的物品,那么一个空列表是适当的。你在说什么“微不足道的事情”? –

+0

Scheme并没有真正的“null”概念(就像Java和类似的语言一样),所以如果你的程序依赖于这样一个概念,那么你应该重新考虑你的设计。 –

1

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))) 

这是正确的:代码没有占到没有的情况。

相关问题