【发布时间】:2020-04-09 22:43:21
【问题描述】:
这是“用 Erlang 编程”(第 2 版)中的一个示例:
count_chars([], Result) ->
Result;
count_chars([C|Substring], #{C := N}=Result) ->
count_chars(Substring, Result#{C := N+1 });
count_chars([C|Substring], Result) ->
count_chars(Substring, Result#{C => 1}).
..它无情地产生以下错误:
变量“C”未绑定
所以我有点卡在这里;在我看来,变量 'C' 是绑定的,即它必须是字符串的头部(只是一个字符的链接列表,对吗?)。然而 Erlang 不同意我的观点,它打破了我现在正在阅读的(可能是过时的?)书中的例子。
那怎么了?在这个特定示例中,模式匹配的正确方法是什么?
附言我正在使用从官方网站下载的最新版本的 Erlang。
【问题讨论】:
-
模式匹配不适用于带有变量的地图,请参阅stackoverflow.com/a/34810812/1030675 和stackoverflow.com/a/59148351/1030675。
-
这本书包含了很多关于地图应该如何在 erlang 中工作的一厢情愿。因此,我发现这本书的那一部分非常令人沮丧。如果我没记错的话,解释是模式匹配的顺序是未知的,当你写
[C|Substring], #{C := N}=Result时,你假设模式[C|Substring]将首先匹配,所以C被绑定在第二个模式中.但是,如果模式以相反的顺序匹配,则 C 将在映射模式中未绑定,因此会出现错误消息。 -
#{C := N}=Result不适用于引入地图数据结构的 OTP 的第一个版本,但现在可以使用。