Почему сопоставление с образцом для этой строки в erlang приводит к «строке» для хвоста и значению ascii для списка? - PullRequest
1 голос
/ 28 апреля 2019

Я пытался написать функцию сопоставления с шаблоном на эрланге, например:

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, а хвост - к буквам?Есть ли лучший способ сопоставить шаблон с «списком строк»?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2019

В Erlang строки - это просто список значений ascii.Он также отображает списки целых чисел, где каждое целое число является печатаемым кодом ascii, в виде строк.Таким образом, [48, 49] выведет "01", поскольку 48 соответствует 0, а 49 - 1.Поскольку у вас есть строка "ABC", это то же самое, что и [65 | [66 | [67]]], и [66, 67] будет отображаться как "BC".

Если вы хотите написать функцию для сопоставления с образцом символов, вам следуетиспользуйте буквенный синтаксис символа, за которым следует $, за которым следует символ.Таким образом, вы бы написали

to_end($A) -> $Z;
to_end($B) -> $Y;
to_end($C) -> $X;
...
to_end($Z) -> $A.

вместо to_end("A") -> "Z", что совпадает с to_end([65]) -> [90].

0 голосов
/ 30 апреля 2019

Почему заголовок сопоставления с шаблоном этого типа в списке всегда приводит к значению 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>

Кстати, все функции «сопоставлены с шаблоном», так что «функция согласованного с шаблоном» является избыточной,Вы можете просто сказать, «функция».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...