我有一些这样的代码:
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).
因为只有在列表的头部不相等时,执行才会进入第二个子句。