Erlang列表解析

列表解析是一种无须使用fun,map或filter来创建列表的表达式,他能使代码更加简洁,更加容易理解。
如:
1>L= [1,2,3,4].
2>lists:map(fun(X)->2*X end,L).
这一功能可用列表解析来实现:
[2*X || X<-L].
记号[F(X) || X <- L] 表示由F(X)组成的列表,其中X取值于L。

列表解析最常见的形式:[X ||  条件1,条件2,...]
如:
1>[X || {a,X} <- [{a,1},{b,2},{c,3},{a,4},hello,"www"]].
[1,4]

列表解析范例:
1. total函数使用列表解析改进:
total(L) ->
    lists:sum([shop:cost(A)*B || {A,B} <- L]).

附:之前的total函数定义
(1). total([{What,N}|T]) ->
        shop:cost(What)*N + total(T);
total([]) ->
        0.
(2). total(L) ->
        lists:sum(lists:map(fun({What,N})->shop:cost(What)*N end,L)).

2. 用列表解析编写一个更简洁的map定义:
map(F,L) -> [F(X) || X <- L].
附:之前的map定义
map(_,[])       -> [];
map(F,[H|T])    -> [F(H)|map(F,T)].

3.快速排序:
qsort([]) -> [];
qsort([Pivot|T]) ->
        qsort([X || X <- T,X < Pivot])
        ++ [Pivot] ++
        qsort([X || X <- T,X > Pivot]).

4. 字符串全排列:
perm([]) -> [[]];        %%注意这里是两个中括号,因为返回列表的元素也是列表。
perm(L) -> [[H|T] || H <-L,T <-perm(L--[H])].
执行:
17> lib_misc:perm("123").
["123","132","213","231","312","321"]

5.毕达哥拉斯三元组
pythag(N) ->
        [{A,B,C} ||
        A <- lists:seq(1,N),
        B <- lists:seq(1,N),
        C <- lists:seq(1,N),
        A+B+C =< N,
        A*A + B*B =:= C*C
        ].




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值