2

我现在学习 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,并且输出再次将如我所料。但是用三个 NI 总是得到这么奇怪的结果。有人可以为我解释一下吗?

我使用 ArchLinux 和 GNU Emacs。

4

2 回答 2

3

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

为了确保这是一个列表,模式匹配它像这样:

1> [A, B, C] = "\b\e@".
"\b\e@"
2> {A, B, C}.
{8,27,64}
于 2014-09-23T21:41:00.613 回答
1

在 Erlang 中,字符串实际上是一个列表,因此 "\b\e@" 与 [8,27,64] 相同。只是因为这些数字是 ascii 可打印的,erlang shell 会将其打印为字符串。

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

您可以查看这些符号的 ascii 代码,前面带有 $ 符号。

2> $\b.
8
3> $\e.
27
4> $\@.
64
于 2014-09-24T03:20:56.393 回答