Erlang lists:concat/1

  很久没来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、如果参数都是字符串或者列表时,直接用“++”操作符吧,省去了匹配过程。

你可能感兴趣的:(erlang,列表,lists)