我正在編寫一個程序,該程序可以具有列表或字符串作爲參數。我如何在Erlang中以編程方式說明字符串和列表之間的區別。喜歡的東西:確定項目是Erlang中的字符串還是列表
print(List) -> list;
print(String) -> string.
我正在編寫一個程序,該程序可以具有列表或字符串作爲參數。我如何在Erlang中以編程方式說明字符串和列表之間的區別。喜歡的東西:確定項目是Erlang中的字符串還是列表
print(List) -> list;
print(String) -> string.
io_lib:printable_list可能是你在找什麼。但是它不處理unicode只有拉丁-1編碼。如果你需要檢測unicode字符串,我認爲你可能會運氣不好。最好的辦法是僞造你的列表,如下所示:{string,[$ a,$ b,$ c]}。一種建立你的類型。
當is_list(L) - > {string,L}時,使用像string(L)這樣的構造函數。
而只是使用該鍵入構建全部通過您的應用程序。
另一方面,你可以將所有的字符串視爲列表而不是區分。
你可以做的最好的事情是標記你的結構爲Jeremy Wallsuggested。反正你可以決定檢查輸入到你的模塊/子系統/應用/ ...
is_string([]) -> true;
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T);
is_string(_) -> false.
不幸的是昂貴的操作,你不能在後衛使用。
但是在你的例子中列表會顯示爲一個字符串,這是否正確? – Zubair 2010-03-19 21:40:25
我不明白問題。你的意思是像'new_string(X) - > true = is_string(X),{string,X} .''嗎?所以答案是肯定的。 – 2010-03-19 22:50:51
爲什麼你需要分開這些?字符串是erlang中的列表(大部分時間)。
您需要這樣做的最常見原因是樹中的嵌套列表,其中一些子列表是需要被視爲列表條目而不是子樹的字符串。沒有標記列表操作,如扁平化和樹遍歷變得更加困難。 – 2010-03-24 15:42:15
沒錯,在這種情況下,我使用僞打字來解決您的解決方案,因爲這是構建您自己的控制流程的一種方式。 – Weasel 2010-03-25 18:32:58
Erlang實現了不同的函數來測試列表是否是模塊io_lib中的扁平列表。儘管Jeremy Wall評論有一個函數來測試一個平面列表是否包含unicode字符以及latin1版本。
如果你想測試你可以使用平的unicode列表 io_lib:char_list(期限) http://erlang.org/doc/man/io_lib.html#char_list-1
io_lib:char_list/1功能的實現是:
char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800;
is_integer(C), C > 16#DFFF, C < 16#FFFE;
is_integer(C), C > 16#FFFF, C =< 16#10FFFF ->
char_list(Cs);
char_list([]) -> true;
char_list(_) -> false.
一個檢查不錯的選擇latin1編碼的字符串是io_lib:latin1_char_list(Term) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1
io_lib:latin1_char_list/1 function implementation is :
latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 ->
latin1_char_list(Cs);
latin1_char_list([]) -> true;
latin1_char_list(_) -> false.
請檢查io_lib模塊文檔以獲取其他類似功能。
即使你的回答是完全正確的,你不需要冷靜地回答我的答案。當我回答時,這是完全正確的。查找日期,並在Erlang/OTP分發中將Unicode支持添加到'io_lib'時。 – 2017-04-09 09:13:51
謝謝。是的,我確實想到了這種僞打字,但我不知道這是否是在Erlang做事的好方法。 – Zubair 2010-03-19 20:16:17
我見過的另一個選項是將所有字符串保存爲二進制文件。 – 2010-03-24 15:41:18