我調試錯誤,並發現undefined
已追加到列表中,這引起了崩潰以後。未定義追加到列表
我預計追加其他的東西比與++
操作列表會導致崩潰。但undefined
並非如此。這裏有一個例子:
1> [1,2,3] ++ undefined.
[1,2,3|undefined]
雖然它不會崩潰,該列表是沒有充分發揮作用了:
1> L = [1,2,3] ++ undefined.
[1,2,3|undefined]
2> L ++ [4].
** exception error: bad argument
in operator ++/2
called as [1,2,3|undefined] ++ [4]
爲什麼會出現這種情況? 這與erlang中列表的底層實現有關嗎?
因此,與幾個同伴在#@二郎討論Freenode的這個。這是「不正確列表」的一個例子。它有一些好處。考慮一個元組:'{key,value}'。在erlang VM中,這是三個術語。一個術語是兩個元素的元組,另外兩個是術語'key'和'value'。訪問元組時,首先必須對元組術語進行解引用,以訪問它所包含的兩個術語。但是,假設我們將它實現爲不正確的列表:'[key | value]'。使用這種格式,您不必對一個術語進行解引用,並且可以節省一段內存(因爲您不必存儲元組術語)。 – 2013-02-19 20:03:16
這是有效的,因爲Erlang列表是CONS列表,意味着列表中的每個單元格都是一個雙字對,等同於'struct list_cell {Eterm hd; Eterm tl;}'。 '[a | b]'創建一個list_cell,其中hd設置爲原子'a',t1設置爲atom'b'。還應該指出,恐嚇分子可能(並且合法/合理)是不正確的名單。 – 2013-02-19 20:12:49
聲音正確。下面是一些鏈接,解釋不當列表及其用途:http://stackoverflow.com/questions/1919097/functional-programming-what-is-an-improper-list http://stackoverflow.com/questions/5088575/practical在erlang中使用不正確的列表 - 也許是所有功能語言 – Isac 2013-02-19 20:14:45