天天看点

erlang的数据类型 (2)

 继续前面说列表。

列表里面的元素,第一个成为head,head之后的都叫tail。用erlang的内置方法看一下:

> hd([1,2,3,4]).
1
> tl([1,2,3,4]).
[2,3,4]      

 为什么要这样呢?因为列表的指针是在头部的,对头部进行操作是最快捷和高效的。

使用竖线| 能快速区分头部和尾部:

> [H|T]=[1,2,3,4].
[1,2,3,4]
> H.
1      

 竖线运算符还能把两个列表连在一起:

> L = [3,3,4].
[3,3,4]
> LL = [1,1,1|L].
[1,1,1,3,3,4]      

 不过竖线后面必须是一个列表:

> [66,77|88].
[66,77|88]
> [66,77|[88]].
"BMX"      

六,列表推导

和python一样,erlang也有列表推导式List comprehensives。

这个语法比较简单,我们看几个例子:

> [2*N || N <- [1,2,3,4]].
[2,4,6,8]
> [X+Y || X <- [1,2], Y <- [2,3]].
[3,4,4,5]
> Weather = [{toronto, rain}, {montreal, storms}, {london, fog},  {paris, sun}, {boston, fog}, {vancouver, snow}].
[{toronto,rain},
 {montreal,storms},
 {london,fog},
 {paris,sun},
 {boston,fog},
 {vancouver,snow}]
> FoggyPlaces = [X || {X, fog} <- Weather].
[london,boston]      

七,二进制

erlang对二进制的操作也提供了一些方法。

比特是由两个小于号和两个大于号包装的<<>>,每个元素包含一个冒号,元素间用逗号分开:

> Color = 16#F09A29.
15768105
> Pixel = <<Color:24>>.
<<240,154,41>>      

 比特也满足模式匹配:

> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> <<Pix1,Pix2,Pix3,Pix4>> = Pixels.
** exception error: no match of right hand side value <<213,45,132,64,76,32,76,0,0,234,32,15>>
> <<Pix1:24, Pix2:24, Pix3:24, Pix4:24>> = Pixels.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> <<R:8, G:8, B:8>> = <<Pix1:24>>.
<<213,45,132>>
> R.
213      

这里暂不介绍二进制的左移和右移,以及位操作。 

八,二进制推导

二进制语法也有推导式,我们简单看几个例子:

> [ X || <<X>> <= <<1,2,3,4,5>>, X rem 2 == 0].     
[2,4]
> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> RGB = [ {R,G,B} || <<R:8,G:8,B:8>> <= Pixels ].
[{213,45,132},{64,76,32},{76,0,0},{234,32,15}]      

OK,就先这些吧。