2011-09-19 64 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))) 

這是正確的:代碼沒有佔到沒有的情況。

相關問題