Erlang列表解析

来源:互联网 发布:淘宝现在什么好卖2017 编辑:程序博客网 时间:2024/04/29 07:08
列表解析是一种无须使用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
        ].




原创粉丝点击