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