Я недавно начал изучать Erlang и столкнулся с любопытным исключением, которое я не могу объяснить.Соответствие шаблону Erlang string как список в функции
Мой исходный код выглядит следующим образом:
-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).
Очень базовый код для подсчета числа открытия и закрытия фигурных скобок в строке.
В оболочке Эрланга, когда я пытаюсь вызвать функцию 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 просто перечисляют inte rnally? Почему некорректно сопоставить строку с строкой, используя конструкцию [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]
Вот и все! Спасибо за краткое объяснение. Маркировка как принято. – user3813812
или вы можете сравнить H с $ {, другим способом представления 123, но показывая его как символ. – Pascal