一個菜鳥球拍的問題。我使用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和類似的語言一樣),所以如果你的程序依賴於這樣一個概念,那麼你應該重新考慮你的設計。 –