我现在学习了Erlang和列表理解,发现了一个奇怪的问题。所以我有一个简单的列表理解,用一个简单公式,没有过滤器:
gen_list(List)->
[N*N || N <- List].
输出正如我所期望的那样是正确的:gen_list([2,3,4]). [4,9,16]
然后我这样做:
gen_list(List)->
[N*N*N*N || N <- List].
输出再次正确:gen_list([2,3,4]). [16,81,256]
。但当我将公式定义为:gen_list(List)->
[N*N*N || N <- List].
时,我得到了下一个输出:gen_list([2,3,4]). "be@"
。
这是什么:"be@"
??为什么我只有三个N才能得到它?我甚至可以写这样的公式:N*N*N*N*N*N*N*N
,输出将再次如我所期望的那样。但是有了三个N,我总是得到这样一个奇怪的结果。有人能为我解释一下吗?
我使用ArchLinux和GNU Emacs。
"be@"
是Erlang在整数位于ASCII可显示范围内时表示整数列表的方法。
为了确保这是一个列表,模式匹配如下:
1> [A, B, C] = "be@".
"be@"
2> {A, B, C}.
{8,27,64}
在Erlang中,字符串实际上是一个列表,因此"\b\e@"与[8.27,64]相同。这只是因为这些数字是ascii可打印的,erlang shell会将其打印为字符串。
1>[8,27,64].
"be@"
你可以查看这些符号的ascii代码前面有一个$符号。
2> $b.
8
3> $e.
27
4> $@.
64