我最近开始研究 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 shell 中,当我尝试调用函数 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]
?
执行 BIFis_list("{}").
返回true
。
我真诚地感谢有人对例外的解释。
谢谢你。
Erlang/OTP 17 [erts-6.2] [source-aaaefb3] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]