最近、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]