Erlang列表理解奇怪的行为

时间:2014-09-23 21:31:28

标签: list erlang list-comprehension beam

我现在学习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]). "\b\e@"

这是什么:"\b\e@" ??为什么我只有当我有三个N时才能得到它?我甚至可以写出这样的公式:N*N*N*N*N*N*N*N,输出也会如我所料。但是有三个N我总是得到这样一个奇怪的结果。有人可以帮我解释一下吗?

我使用ArchLinux和GNU Emacs。

2 个答案:

答案 0 :(得分:3)

"\b\e@"是Erlang表示当整数落在ASCII可显示范围内时整数列表的方式。

为了确保这是一个列表,模式匹配如下:

1> [A, B, C] = "\b\e@".
"\b\e@"
2> {A, B, C}.
{8,27,64}

答案 1 :(得分:1)

在Erlang中,string实际上是一个列表,所以&#34; \ b \ e @&#34;与[8,27,64]相同。只是因为这些数字是ascii-printable,erlang shell会将它打印为字符串。

1>[8,27,64].
"\b\e\@"

你可以在它前面用$符号查看这些符号的ascii代码。

2> $\b.
8
3> $\e.
27
4> $\@.
64