2012-01-30 49 views
3

這是我以前的問題的後續行動:Why do we need nil?顯然,大部分時間都使用正確的列表。但是,不正確列表的目的是什麼?什麼是不正確的名單?

+0

「你的_opinion_是什麼?」在你的問題中是一個危險的句子。正如你所知道的,在Stack Overflow上沒有任何意見,只有事實。尋求意見只會讓你的問題關閉。它已經有4票贊成票;進一步的近距離投票會導致你的問題被關閉。 – 2012-01-30 20:19:22

+0

爲了保存這個問題,我會完全重寫這個問題。我希望你能和你在一起。 – 2012-01-30 20:20:15

+0

感謝提醒和編輯,克里斯。我沒有意識到這一點。那麼,但它仍然關閉? – day 2012-01-31 08:23:06

回答

4

沒有很好的理由。唯一不正確的列表真正有用的是作爲關聯列表語法的一部分 - 甚至在那裏,鍵值對的自定義語法會更好。任何你認爲不適當列表的用法都可以用記錄類型更好地實現 - 畢竟,包含列表:你可以根據記錄定義Lisp列表,但不能以其他方式定義(因爲列表不允許你定義數據結構的類型與語言中的所有其他類型不相交)。

濫用成對和列表來代表所有類型的數據是我喜歡叫的Lisp程序員的疾病,這真是令人遺憾的是,許多Lisp的倡導者提倡它。我必須多次清理那些東西。

+1

sacundim,感謝您的參與。我一直困惑這個列表vs記錄相當長一段時間。我想了解更多。但是,使用谷歌搜索不會返回任何有用的結果。既然你說過你多次清理過這些東西,如果它存在某處,我想更多地看到它。謝謝。 – day 2012-01-31 08:33:30

6

非常好的問題! (好吧,我喜歡Chris重寫它,反正......)。根據我的經驗,不正確列表最常見的用法是輕量級的兩元素結構。

推理過程如下:「gee,我需要一個雙元結構哦,等等,爲什麼不用'cons'呢?它是內置的,它的內置引用非常好的支持語法,到底是什麼,我會做的。「

特別是,諸如「assoc」之類的內置操作通常以假定給出不正確的兩元素列表的列表的方式實現。

+0

+1很好的回答! (感謝您的信任投票。:-)) – 2012-01-30 20:45:09

4

不正確列表的存在是基本構件塊cons,carcdr存在的自然結果。 Lisp的核心是這三個構成了各種更復雜數據類型的基礎。以某種方式挑出不合適的流放名單將需要施加任意的限制。

+1

不,它不是。這實際上是Lisp動態類型化的事實(或者從lambda演算的角度來看,沒有類型化)。靜態類型的Lisp類似物沒有虛線列表,因爲它們與「cons」相對應的類型將第二個參數限制爲列表。例如,在Haskell中,我們有'(:) :: a - > [a] - > [a]'(':'運算符需要一個'a'和一個'a'列表並返回一個列表'a ')。 – 2012-01-30 23:05:52

+1

嘿,我不同意你們倆:)。建立一個動態類型的語言很容易,其中cons只能在第二個元素是適當的列表時使用。例如,請參閱球拍中的教學語言級別。例如,這與有關+運算符的檢查有點相似。+不適用於字符串,並在應用時檢查。 – 2012-01-31 17:30:45

1

對於除使用cons構建的列表以外的任何數據類型,「不正確列表」是一個模糊的術語。

正如John所說的,一個例子是以與使用ML中的元組相同的方式使用cons對。

另一個例子是作爲列表上的變體。例如,可以如下定義流:

;; A Stream-of-X is one of 
;; - null, ie '() 
;; - (cons X Stream-of-X) 
;; - a procedure taking no arguments and returning a Stream-of-X result 

;; nats-from : nat -> Stream-of-nat 
(define (nats-from n) 
    (cons n (lambda() (nats-from (+ n 1))))) 
相關問題