2014-03-04 55 views
2

如何獲取列表的類型。如果列表是proplist,我想執行代碼。 讓我們說L = [a,1,b,2,c,3, ...]。在列表L,我將其轉換成proplist這樣像erlang中的is_proplist?

L = [{a,1}, {b,2}, {c,3}, ...]. 

如何確定列表是否是一個proplist變種? erlang:is_list/1對我無用。

回答

9

您可以使用類似:

is_proplist([]) -> true; 
is_proplist([{K,_}|L]) when is_atom(K) -> is_proplist(L); 
is_proplist(_) -> false. 

,但需要考慮該功能不能在後衛使用。

+0

列出像'[a]'和'[a,b]'也應該被視爲proplists。 – Ning

+0

鍵也不一定是原子,也可以是二進制,字符串/列表。 '[{}}的列表,{<<"OMG">>,omg}]'將會失敗 – matov

5

你需要檢查列表中的每個元素是否是兩個元素的元組。可與lists:all/2做到:

is_proplist(List) -> 
    is_list(List) andalso 
     lists:all(fun({_, _}) -> true; 
        (_)  -> false 
        end, 
        List). 

這取決於「proplist變種」的定義,您使用的,當然。以上是什麼通常通過「proplist變種」的意思,但the documentation for the proplists module說:

屬性列表是包含在任一元組,其第一元素是用於查找和插入,或原子鍵的形式條目普通列表,其中的元組簡寫爲{Atom, true}

+0

然後你需要一個單個原子的子句作爲有效的proplist元素。 –