2010-03-19 89 views
5

我正在編寫一個程序,該程序可以具有列表或字符串作爲參數。我如何在Erlang中以編程方式說明字符串和列表之間的區別。喜歡的東西:確定項目是Erlang中的字符串還是列表

print(List) -> list; 
print(String) -> string. 

回答

6

io_lib:printable_list可能是你在找什麼。但是它不處理unicode只有拉丁-1編碼。如果你需要檢測unicode字符串,我認爲你可能會運氣不好。最好的辦法是僞造你的列表,如下所示:{string,[$ a,$ b,$ c]}。一種建立你的類型。

當is_list(L) - > {string,L}時,使用像string(L)這樣的構造函數。

而只是使用該鍵入構建全部通過您的應用程序。

另一方面,你可以將所有的字符串視爲列表而不是區分。

+0

謝謝。是的,我確實想到了這種僞打字,但我不知道這是否是在Erlang做事的好方法。 – Zubair 2010-03-19 20:16:17

+0

我見過的另一個選項是將所有字符串保存爲二進制文件。 – 2010-03-24 15:41:18

3

你可以做的最好的事情是標記你的結構爲Jeremy Wallsuggested。反正你可以決定檢查輸入到你的模塊/子系統/應用/ ...

is_string([]) -> true; 
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T); 
is_string(_) -> false. 

不幸的是昂貴的操作,你不能在後衛使用。

+0

但是在你的例子中列表會顯示爲一個字符串,這是否正確? – Zubair 2010-03-19 21:40:25

+0

我不明白問題。你的意思是像'new_string(X) - > true = is_string(X),{string,X} .''嗎?所以答案是肯定的。 – 2010-03-19 22:50:51

0

爲什麼你需要分開這些?字符串是erlang中的列表(大部分時間)。

+1

您需要這樣做的最常見原因是樹中的嵌套列表,其中一些子列表是需要被視爲列表條目而不是子樹的字符串。沒有標記列表操作,如扁平化和樹遍歷變得更加困難。 – 2010-03-24 15:42:15

+0

沒錯,在這種情況下,我使用僞打字來解決您的解決方案,因爲這是構建您自己的控制流程的一種方式。 – Weasel 2010-03-25 18:32:58

3

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模塊文檔以獲取其他類似功能。

+0

即使你的回答是完全正確的,你不需要冷靜地回答我的答案。當我回答時,這是完全正確的。查找日期,並在Erlang/OTP分發中將Unicode支持添加到'io_lib'時。 – 2017-04-09 09:13:51

相關問題