在 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 中具有相同的模式匹配变量是不是意味着值相同?的主要内容,如果未能解决你的问题,请参考以下文章