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



我有一些这样的代码:

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).
如果是,为什么,

如果不是,为什么不?

是的。

如果是,为什么

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

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

2> X = 10.

过了一会儿,你写道:

5> X = 20.

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

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

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

因为只有在列表的头部不相等时,执行才会进入第二个子句。

最新更新