为什么erlang中此字符串上的模式匹配会导致;“字符串”;对于尾部和列表的ascii值?

为什么erlang中此字符串上的模式匹配会导致;“字符串”;对于尾部和列表的ascii值?,erlang,Erlang,我试图用erlang编写一个模式匹配函数,如: to_end("A") -> "Z". 整个想法是使用模式匹配函数将字符串(如“ABC”)转换为不同的字符串(如“ZYX”)。它看起来像一个字符串被表示为引擎盖下的列表 我所依赖的事实是,erlang中“字符串”上的模式匹配将导致单个字符串字符。但我发现: 21> F="ABC". 22> F. "ABC" 23> [H | T]=F. "ABC" 24> H. 65 25> T. "BC" 为什么这种类型的

我试图用erlang编写一个模式匹配函数,如:

to_end("A") -> "Z".
整个想法是使用模式匹配函数将字符串(如“ABC”)转换为不同的字符串(如“ZYX”)。它看起来像一个字符串被表示为引擎盖下的列表

我所依赖的事实是,erlang中“字符串”上的模式匹配将导致单个字符串字符。但我发现:

21> F="ABC".
22> F.
"ABC"
23> [H | T]=F.
"ABC"
24> H.
65
25> T.
"BC"

为什么这种类型的模式匹配列表的头部总是产生ASCII值,而尾部总是产生字母?有没有更好的方法对“字符串列表”进行模式匹配?

在Erlang中,字符串只是ascii值的列表。它还以字符串形式显示整数列表,其中每个整数都是可打印的ascii码。所以
[48,49]
会打印出
“01”
,因为48对应
0
,49对应
1
。由于您有字符串“ABC”,这与
[65 |[66 |[67]]]
相同,
[66,67]
将显示为
“BC”

如果要编写一个函数来对字符进行模式匹配,则应使用字符文字语法,即
$
后跟字符。那么你会写信吗

结束($A)->$Z;
结束时($B)->$Y;
结束时($C)->$X;
...
最后($Z)->$A。
而不是
to_end(“A”)->“Z”
,这与
to_end([65])->[90]
相同

为什么列表上的这种模式匹配的头总是 结果为ASCII值,尾部结果为字母

在erlang中,字符串
“ABC”
是列表
[65,66,67]
的简写符号。该列表的头部是
65
,而该列表的尾部是列表
[66,67]
,shell恰好显示为
“BC”
。哇

shell在显示字符串/列表时非常糟糕:有时shell显示列表,有时shell显示双引号字符串:

2> [0, 65, 66, 67].
[0,65,66,67]

3> [65, 66, 67].
"ABC"

4> 
…这简直是愚蠢。每个初级和中级erlang程序员都会在某个时候被这一点弄糊涂

请记住:当shell显示双引号字符串时,它实际上应该显示一个列表,其元素是双引号字符串中每个字符的字符代码。shell显示双引号字符串的事实是一个可怕的特性??对于erlang来说,这使得在很多情况下很难破译正在发生的事情。你必须在心里对自己说,“我在贝壳里看到的那根绳子真的是列表…”

当您想要显示(比如)一个人的测试分数列表时,shell为某些列表显示双引号字符串的事实真的很糟糕:
[88,97,92,70]
,shell输出:
“Xa\\F”
。您可以使用
io:format()
方法绕过以下问题:

6> io:format("~w~n", [[88,97,92,70]]).
[88,97,92,70]
ok
但是,如果您只是想立即看到shell显示为字符串的实际整数列表,那么一种快速而肮脏的方法是将整数
0
添加到列表的开头:

7> Scores = [88,97,92,70].
"Xa\\F"

8> [0|Scores].
[0,88,97,92,70]
哦,好的

整个想法是将诸如“ABC”之类的字符串转换为某些内容 不同的,例如“ZYX”使用模式匹配函数

因为字符串是整数列表的简写,所以可以使用加法更改这些整数:

-module(my).
-compile(export_all).

cipher([]) -> [];
cipher([H|T]) ->
    [H+10|cipher(T)].  %% Add 10 to each character code.
在外壳中:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:cipher("ABC").
"KLM"

3>
顺便说一下,所有函数都是“模式匹配的”,所以说“模式匹配的函数”是多余的,你可以说“函数”