开始慢慢erlang的学习了,文中所说也许有误,欢迎指正。
string就是list
在erlang中 string是用list表示的 先开始让我一头雾水。
在erlang shell中:
3> [97,98,99]. "abc" 4>
得到了这样的结果 编译器试图把转换为string的list都进行了转换
同样的事情在erlang模块的函数中也可以看见
例如:
4> atom_to_list(abc). "abc" 5> integer_to_list(123). "123"
同理直接对string进行模式匹配也是可以的:
6> [97,B,C]="abc". "abc" 7> B. 98 8> C. 99 9>
那遇到以上情况 要怎么正常显示出list呢 加个0就可以 原因也很简单 0不能转化为任何的字符(有误请指出)被当做非法的 编辑器也就不会转了(其他的只要不会被当成字符的也行):
11> [0|"abc"]. [0,97,98,99] 12> [-1|"abc"]. [-1,97,98,99] 13>
以上所说对中文之类的也同样适用:
14> [0|"Iteye博客"]. [0,73,116,101,121,101,178,169,191,205] 15> [178,169,191,205]. "博客"
此外string也完全支持list的++操作
17> "abc"++"d".
"abcd"
18> "abc"++[0].
[97,98,99,0]
严格list和非严格list
严格的list都是以空列表(nil)[]作为结尾的:
19> [Head|Tail]=[1]. [1] 20> Head. 1 21> Tail. []
当然空表不是以空表结尾的(没有无限递归在里面):
23> [Head|Tail]=[]. ** exception error: no match of right hand side value []
而不严格的list就是结尾不是以[]结尾的
要构造一个这样的list也是很简单的:
24> [1]++0. [1|0] 25> [1,2,3|0]. [1,2,3|0]
然后匹配一下:
28> [Head|Tail]=[1|0].
[1|0]
29> Head.
1
30> Tail.
0
可以看到已经没有空列表的踪影了
不过这样的非严格列表在实际使用的时候会比较麻烦,一些对列表操作的递归的终止就是空列表
在一些常用操作中也无法正确处理非严格列表:
41> List=[1,2,3,4|0].
[1,2,3,4|0]
42> [X||X<-List].
** exception error: bad generator 0