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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值