很久没来iteye了,也很久没写blog了,主要是找实习的一些事情有点麻烦。
接下来的很长时间,blog会记录一些Erlang stdlib的一些常用的module。当然,也会尽力去看一下这些module fuctions的具体实现(BIF暂不考虑)。
这一篇,主要是lists:concat/1
API的具体介绍,详见Erlang官网,erlang.org/doc/man/lists.html#concat-1
找下这个函数的Erlang源码实现:
%% lists:concat/1 的 结果为string() 类型
-spec concat([concat_thing()]) -> string().
concat(List) ->
flatmap(fun thing_to_list/1, List).
-spec flatmap(fun((D) -> [R]), [D]) -> [R].
flatmap(F, [Hd|Tail]) ->
%% 尾递归,
%% ++ 操作
%% 将list中得元素,使用F函数做处理,这点值注意借鉴。
F(Hd) ++ flatmap(F, Tail);
%%特殊处理。当list为空时,判断F是否为函数,是,结果为[]
flatmap(F, []) when is_function(F, 1) -> [].
%%将不同类型的元素,都转换为list。
thing_to_list(X) when is_integer(X) -> integer_to_list(X);
thing_to_list(X) when is_float(X) -> float_to_list(X);
thing_to_list(X) when is_atom(X) -> atom_to_list(X);
thing_to_list(X) when is_list(X) -> X. %Assumed to be a string
总结下:
1、调用函数时,可以不用fun() -> *** end 这么麻烦的写了,直接fun ***/* 简单明了;
2、使用这个函数时,参数不能是二进制类型;
3、字符串的本质就是数组,直接用;
4、如果参数都是字符串或者列表时,直接用“++”操作符吧,省去了匹配过程。