与 Erlang 中的映射模式匹配时的非法表达式

Posted

技术标签:

【中文标题】与 Erlang 中的映射模式匹配时的非法表达式【英文标题】:Illegal expression when pattern matching with maps in Erlang 【发布时间】:2017-12-12 22:48:46 【问题描述】:

我正在尝试在 Armstrong 的 Erlang 书中的交互式 shell 上执行示例代码。书上是这么说的:

1> Henry8 = # class => king, born => 1491, died => 1547 . # born => 
1491, class=> king, died => 1547 .
2> # born => B  = Henry8.
# born => 1491, class=> king, died => 1547 .

但是,这就是我在 shell 上得到的,看来模式匹配失败了:

1> Henry8 = # class => king, born => 1491, died => 1547 .
#born => 1491,class => king,died => 1547
2> # born => B  = Henry8.
* 1: illegal pattern

【问题讨论】:

【参考方案1】:

=> 用于构建地图。要对地图进行模式匹配,您需要改用:=

1> Henry8 = # class => king, born => 1491, died => 1547 .
#born => 1491,class => king,died => 1547
2> # born := B  = Henry8.
#born => 1491,class => king,died => 1547
3> B.
1491

这在“模式中的映射”here 部分中有记录。

【讨论】:

【参考方案2】:

代码示例前面有文字:

匹配地图字段的模式 我们在映射文字中使用的:= 语法也可以用作映射模式。

该文本之前有一整节解释=>:= 在构建地图时的区别,因此您应该知道这两种不同的语法。

在书中,示例的第 2 行说:

2> #born := B = Henry8.

在你输入的 shell 中:

2> # born => B  = Henry8.

我建议你再仔细阅读section 5.3,同时阅读pertinent section of LYSE,其中包括这个例子:

1> Pets = #"dog" => "winston", "fish" => "mrs.blub".
#"dog" => "winston","fish" => "mrs.blub"

2> #"fish" := CatName, "dog" := DogName = Pets.
#"dog" => "winston","fish" => "mrs.blub"

7> CatName.
"mrs.blub"

8> DogName.
"winston"

在这里可以一次抓取任意数量的项目的内容 时间,无论键的顺序如何。您会注意到元素已设置 与=> 并匹配:=:= 运算符也可用于更新地图中的现有键

【讨论】:

以上是关于与 Erlang 中的映射模式匹配时的非法表达式的主要内容,如果未能解决你的问题,请参考以下文章

Erlang函数与模式匹配

Erlang 记录与映射组

在 Erlang 中进行模式匹配映射时,为啥这个变量是未绑定的?

在erlang中列出尾部模式匹配

什么是 Erlang 中的模式匹配

为啥 Erlang 中的模式匹配记录会抛出错误