【问题标题】: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).

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

【问题讨论】:

    标签: erlang pattern-matching


    【解决方案1】:

    是的。

    如果是,为什么

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

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

    2> X = 10.
    

    后来,你写道:

    5> X = 20.
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      相关资源
      最近更新 更多