为什么这种模式匹配的头部总是在列表中
结果是 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 显示双引号字符串的事实是一个可怕的 ??feature?? erlang,并且在很多情况下很难理解发生了什么。你必须在心里对自己说,“我在 shell 中看到的那个字符串真的是列表……”
当你想显示一个人的测试分数列表时,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>
顺便说一句,所有函数都是“模式匹配”,所以说“模式匹配函数”是多余的,你可以说“一个函数”。