Почему заголовок сопоставления с шаблоном этого типа в списке всегда приводит к значению ASCII, а хвост - к буквам?
В erlang строка "ABC"
являетсясокращенная запись списка [65,66,67]
.Глава этого списка - 65
, а хвост этого списка - список [66,67]
, который оболочка отображает как "BC"
.Whaa ??!
Оболочка практически не работает при отображении строк / списков: иногда оболочка отображает список, а иногда оболочка отображает строку в двойных кавычках:
2> [0, 65, 66, 67].
[0,65,66,67]
3> [65, 66, 67].
"ABC"
4>
... что просто глупо,Каждый начинающий и промежуточный программист на эрланге в какой-то момент смущается этим.
Просто помните: когда оболочка отображает строку в двойных кавычках, она должна действительно отображать список, элементами которого являются коды символов каждого символа встрока в двойных кавычках.Тот факт, что оболочка отображает строку в двойных кавычках, является УЖАСНОЙэрланга, и это затрудняет расшифровку того, что происходит во многих ситуациях.Вы должны мысленно сказать себе: «Эта строка, которую я вижу в оболочке, действительно является списком ...»
Тот факт, что оболочка отображает строки в двойных кавычках для некоторых списков, действительно отстой, когда вы хотитеотобразите, скажем, список тестовых показателей человека: [88, 97, 92, 70]
и результаты оболочки: "Xa\\F"
.Вы можете использовать метод io:format()
, чтобы обойти это:
6> io:format("~w~n", [[88,97,92,70]]).
[88,97,92,70]
ok
Но, если вы просто хотите на мгновение увидеть фактический список целых чисел, который оболочка отображает в виде строки, быстрый и грязный методстоит добавить целое число 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>
Кстати, все функции «сопоставлены с шаблоном», так что «функция согласованного с шаблоном» является избыточной,Вы можете просто сказать, «функция».