继续前面说列表。
列表里面的元素,第一个成为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,就先这些吧。