Erlang 中 Tuple 使用 以及 List 模块意外

tuple 常用函数

Eshell V6.0 (abort with ^G)
1> TestTuple = {"Kuangfeng", "yidao", 555, {shank, yan}}.
{"Kuangfeng","yidao",555,{shank,yan}}
2> element(4, TestTuple).
{shank,yan}
3> tupel_size(TestTuple).
** exception error: undefined shell command tupel_size/1
4> tuple_size(TestTuple).
4
5> setelement(2,TestTuple, "Zhan").
{"Kuangfeng","Zhan",555,{shank,yan}}
6> tuple_to_list(TestTuple).
["Kuangfeng","yidao",555,{shank,yan}]
9> append_element(TestTuple, "yidao").
** exception error: undefined shell command append_element/2
10> erlang:append_element(TestTuple, "yidao").
{"Kuangfeng","yidao",555,{shank,yan},"yidao"}
11> {1,2} =={2,3}.
false
12> {2,3} =={2,3}.
true
2> erlang:make_tuple(33,a).
{a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,...}
3> erlang:make_tuple(9,[],{2,q},{5,a}).
** exception error: undefined function erlang:make_tuple/4
4> erlang:make_tuple(9,[],[{2,q},{5,a}]).
{[],q,[],[],a,[],[],[],[]}
5> erlang:make_tuple(4,[]).
{[],[],[],[]}
6>

list 常用函数

疑问 一

我对lists:dropwhile/2 始终是不理解,
文档上说:
dropwhile(Pred, List1) -> List2
Types:
Pred = fun((Elem :: T) -> boolean())
List1 = List2 = [T]
T = term()
Drops elements Elem from List1 while Pred(Elem) returns true and returns the remaining list.
将List1列表中的元素作为参数执行Pred函数,如果返回true,将其丢弃,最后返回剩余元素组成的列表
这是别人的测试,对,结果还符合
例子
lists:dropwhile(fun(E) -> is_atom(E) end,[a,1,2,a,b]).
结果
[1,2,a,b]

但是我的测试结果就不一样了,这个函数用的少,但是以后也是不敢用啊:
13> lists:dropwhile(fun(E) -> is_atom(E) end, [1 ,a ,a ,b, s]).
[1,a,a,b,s]
14> lists:dropwhile(fun(E) -> is_atom(E) end,[a,1,2,a,b]).
[1,2,a,b]
15> lists:dropwhile(fun(E) -> is_atom(E) end,[1,a,2,a,b]).
[1,a,2,a,b]
16> lists:dropwhile(fun(E) -> is_atom(E) end,[1,a,2,a,b]).
[1,a,2,a,b]
17>
17> lists:dropwhile(fun(E) -> is_integer(E) end,[1,a,2,a,b]).
[a,2,a,b]
18> lists:dropwhile(fun(E) -> is_integer(E) end,[a,2,a,b]).
[a,2,a,b]
19>
针对这个结果我只能这么理解,就是用list的第一个成员作为参数执行函数,
结果为true,返回所有列表,如果结果为false, 返回除了列表尾巴

疑问二 lists:usort 当有负数的时候排序不正常

usort(Fun, List1) -> List2
按照Fun函数进行排序,如果Fun返回true,那么只返回List1的第一个元素
如果Fun返回false,那么List1从大到小排序
lists:usort(fun(A,B) -> true end, [1,2,2,3,4]).
[1]
lists:usort(fun(A,B) -> false end, [1,2,2,3,4]).
[4,3,2,2,1]
19> lists:usort(fun(A,B) ->true end, [1,2,3,4,0]).
[1]
20> lists:usort(fun(A,B) ->false end, [1,2,3,4,0]).
[0,4,3,2,1]
21> lists:usort(fun(A,B) ->false end, [1,1,2,3]).
[3,2,1,1]
22> lists:usort(fun(A,B) ->false end, [1,1,2,3,-1,-2]).
[-2,-1,3,2,1,1]
23>

疑问三

umerge(Fun, List1, List2) -> List3
这个函数和merge不同的是 当Fun返回true时,返回的List3中不能出现相同的元素
疑问:但是当Fun返回false时,List3中可以有相同的元素。
lists:umerge(fun(A,B)-> true end,[1,2],[2,3]).
[1,2,3]
lists:umerge(fun(A,B)-> false end,[1,2],[2,3]).
[2,3,1,2]

lists 函数中需要注意的区别

原文地址:https://www.cnblogs.com/ShankYan/p/4141855.html