【erlang】列表速构

2019-05-29  本文已影响0人  夏澪

前言

列表速构是在初入门的时候就遇到过的内容,当时不甚解其意,没有深入求索,结果在前几天一个任务中需要使用,在网上一翻,资料寥寥。幸而还有一篇能用,其实稍作剖析,列表速构方法的内部结构是相当清晰的。注意,列表速构只适用于列表转列表,如果有其他需求,需要参考 lists的语法。

结构

 [ X * X || X <- [1,2,3,4,5] ]

速构的列表分为两个部分,以 || 为界限,右边为取值,左边为具体的处理方式。上面这个例子是最简单的取值, X <- [1,2,3,4,5] 代表 X 分五次处理,处理时候的值为 1,2,3,4,5 。处理方式是平方,结果为 [1,4,9,16,25].

拓展

[ {X, X * X} || X <- lists:seq(1,100), X rem 2 == 1, X rem 3 == 2, X rem 4 == 3]

列表速构的右边可以有多个条件,多个条件之间用逗号连接。列表速构的左边格式是任意的,结果会是左边的数据结构的组合列表。

[ rand:uniform(10) || _ <- lists:seq(1,10) ]  
%% lists:seq(1,10) 即 [1,2,3,4,5,6,7,8,9,10]

列表的值也可以不取,上面例子代表的是构造十次,每次构造的是一个10以内的随机数。

使用

初学的时候,leader 举过一个例子。假设有一个圆,圆心在(0,0),半径长为5,求圆上xy值均为整数的点。解决方法是:

[ {X,Y} || X <- lists:seq(-5,5), Y <- lists:seq(-5,5), X*X + Y*Y == 25].
%% 注意右边的顺序, 先用 <- 设定值的范围, 然后再设置其他限制条件

总结

重申一遍, 列表速构是 列表转列表 的方法,输入是一个列表,输出也是一个列表的场合才适用。其他场景一般使用 lists:foldl 方法,或者直接用函数处理。每一种处理方式实现本质是一样的,但速构和lists的方法会看起来更直观可读一些。

上一篇 下一篇

猜你喜欢

热点阅读