2011-09-19 10 views
1

ルーキーラケット質問。私はKrishnamurthiのPLAIの教科書とこれに関連するRacketプログラミング言語を使用しています。空のリストを定義済みの型に渡す:可能ですか?

それでは、私のような定義された型持っているとしましょう:だから

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

を、私はこのthingyは空のリスト'()を受け入れることを得ることができ、その下にあるすべての任意の事情があるのでしょうか?

答えて

2

空のリストは数字ではないので、あなたが持っているタイプ定義は受け付けません。

number?の代わりに(lambda (x) (or (number? x) (null? x)))を使用して、番号または空のリストのいずれかを受け入れることができますが、なぜそれをしたいのかわかりません。

+0

ありがとう、それは多くの助けになりました:) 仕上げのコメント:空のリストを返す行為ですか?私はちょっとした事件をカバーするためにこれをやっていました、btw。 – arkate

+0

あなたの関数が通常、束の項目のリストを返し、空の束の項目を返している場合、空のリストが適切です。どのような「些細な事件」を言っているのですか? –

+0

スキームには実際には "null"という概念はありません(Javaやそれに類する言語のように)ので、プログラムがそのような概念に依存している場合は、デザインを再考する必要があります。 –

1

http://docs.racket-lang.org/plai/plai-scheme.htmlに記載されているように、define-typeはいくつかの異なるバリエーションをとることができます。言語自体がより安全なコードを書くのに役立つような方法で、分離したデータ型を定義することができます。例えば

:Thingysで動作します

#lang plai 

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

コードは現在、体系的Thingysの2つの可能性のある種類を処理する必要があります。 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))) 

をそして、それはそうです:コードは、なしの場合を占めていません。