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が3つしかないのはなぜですか?次のような数式を書くこともできます: N*N*N*N*N*N*N*N、出力は再び期待どおりになります。しかし、NI が 3 つである場合、常にこのような奇妙な結果が得られます。誰かが私のためにこれを説明できますか?

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 では、string は実際にはリストなので、"\b\e@" は [8,27,64] と同じです。これらの数字は ascii-printable であるという理由だけで、erlang シェルはそれを文字列として出力します。

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

これらのシンボルのアスキー コードは、その前に $ 記号を付けて表示できます。

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