ルーキーラケット質問。私はKrishnamurthiのPLAIの教科書とこれに関連するRacketプログラミング言語を使用しています。空のリストを定義済みの型に渡す:可能ですか?
それでは、私のような定義された型持っているとしましょう:だから
(define-type Thingy
[thingy (num number?)])
を、私はこのthingy
は空のリスト'()
を受け入れることを得ることができ、その下にあるすべての任意の事情があるのでしょうか?
ルーキーラケット質問。私はKrishnamurthiのPLAIの教科書とこれに関連するRacketプログラミング言語を使用しています。空のリストを定義済みの型に渡す:可能ですか?
それでは、私のような定義された型持っているとしましょう:だから
(define-type Thingy
[thingy (num number?)])
を、私はこのthingy
は空のリスト'()
を受け入れることを得ることができ、その下にあるすべての任意の事情があるのでしょうか?
空のリストは数字ではないので、あなたが持っているタイプ定義は受け付けません。
number?
の代わりに(lambda (x) (or (number? x) (null? x)))
を使用して、番号または空のリストのいずれかを受け入れることができますが、なぜそれをしたいのかわかりません。
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)))
をそして、それはそうです:コードは、なしの場合を占めていません。
ありがとう、それは多くの助けになりました:) 仕上げのコメント:空のリストを返す行為ですか?私はちょっとした事件をカバーするためにこれをやっていました、btw。 – arkate
あなたの関数が通常、束の項目のリストを返し、空の束の項目を返している場合、空のリストが適切です。どのような「些細な事件」を言っているのですか? –
スキームには実際には "null"という概念はありません(Javaやそれに類する言語のように)ので、プログラムがそのような概念に依存している場合は、デザインを再考する必要があります。 –