列表解析是一种无须使用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
].