erlang中的is_proplist?

Lax*_*khi 3 erlang

如何获取列表的类型.如果列表是proplist,我想执行代码.我们说吧L = [a,1,b,2,c,3, ...].列表是L,我正在将它转换为proplist

L = [{a,1}, {b,2}, {c,3}, ...].
Run Code Online (Sandbox Code Playgroud)

如何确定列表是否为proplist?erlang:is_list/1对我没用.

P_A*_*P_A 9

您可以使用以下内容:

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

但有必要考虑这个功能不能用于警卫.


leg*_*cia 5

您需要检查列表中的每个元素是否是两个元素的元组.可以使用列表完成:all/2:

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

当然,这取决于您使用的"proplist"的定义.以上是"proplist"通常所指的内容,但是proplists模块的文档说:

属性列表是普通列表,包含元组形式的条目,其第一个元素是用于查找和插入的键,或者原子,它们用作元组的简写{Atom, true}.