Я недавно начал изучать Erlang и столкнулся с любопытным исключением, которое я не могу объяснить.
Мой исходный код выглядит следующим образом:
-module(balanced_brackets).
-author("Irrelevant").
-compile(export_all).
is_balanced(String) -> is_balanced(String, 0, 0).
is_balanced([H | T], Opening, Closing) when H =:= "{" ->
is_balanced(T, Opening + 1, Closing);
is_balanced([H | T], Opening, Closing) when H =:= "}" ->
is_balanced(T, Opening, Closing + 1);
is_balanced([], Opening, Closing) -> (Opening - Closing).
Очень простой код для подсчета количества закрывающих и открывающих фигурных скобок в строке.
В оболочке Erlang, когда я пытаюсь вызвать функцию is_balanced как таковую: balanced_brackets:is_balanced("{}").
Выводится следующая ошибка:
** exception error: no function clause matching balanced_brackets:is_balanced("{}",0,0) (balanced_brackets.erl, line 7)
Однако, если я передаю аргумент в виде явного списка, сопоставление с образцом работает правильно: balanced_brackets:is_balanced(["{", "}"]).
Разве строки Erlang не являются просто внутренними списками? Почему неправильно сопоставить строку с шаблоном с помощью конструкции [H | T]
?
Выполнение BIF is_list("{}").
возвращает true
.
Я был бы искренне признателен за чье-нибудь объяснение исключения.
Спасибо.
Erlang/OTP 17 [erts-6.2] [source-aaaefb3] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]