在 Erlang 中具有相同的模式匹配变量是不是意味着值相同?

Posted

技术标签:

【中文标题】在 Erlang 中具有相同的模式匹配变量是不是意味着值相同?【英文标题】:Does having the same variable for pattern matching in Erlang means the value are same?在 Erlang 中具有相同的模式匹配变量是否意味着值相同? 【发布时间】:2018-09-01 13:06:44 【问题描述】:

我有一些这样的代码:

hdistance([H|T], [H1|T1], Distance) when H /= H1 ->
        hdistance(T, T1, Distance + 1);

hdistance([H|T], [H1|T1], Distance) when H == H1 ->
        hdistance(T, T1, Distance).

我可以这样去掉when 子句吗:

hdistance([H|T], [H|T1], Distance) ->
        hdistance(T, T1, Distance + 1);

hdistance([H|T], [H1|T1], Distance) ->
        hdistance(T, T1, Distance).

如果是,为什么,如果不是,为什么不呢?

【问题讨论】:

【参考方案1】:

是的。

如果是,为什么

根据我对地图的经验,我记得制定了一个规则,即不保证匹配顺序,但是一旦其中一个列表匹配并且 H 绑定到一个值,那么另一个列表只有在头部的情况下才会匹配列表等于 H。

你在写的时候可能在shell中经历过类似的事情:

2> X = 10.

后来,你写道:

5> X = 20.

你得到一个错误,说“右手边没有匹配”。对于第一个“匹配”,X 绑定到 10;然后对于第二场比赛,因为 20 与 10 不匹配,你会得到一个错误。它对您的列表的工作方式相同:H 绑定到第一个匹配的值,然后对于第二个匹配,列表的头部必须等于 H。

你实际上可以这样写第二个子句:

hdistance([_|T], [_|T1], Distance) ->
        hdistance(T, T1, Distance).

因为如果列表的头部不相等,则只会执行第二个子句。

【讨论】:

以上是关于在 Erlang 中具有相同的模式匹配变量是不是意味着值相同?的主要内容,如果未能解决你的问题,请参考以下文章

Erlang函数与模式匹配

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

Erlang基本语法汇总

在erlang中列出尾部模式匹配

为啥 OCaml 模式匹配比 Erlang 弱?

Erlang 模式匹配顺序