Erlang模式与别名匹配

时间:2009-11-04 23:23:06

标签: erlang pattern-matching

是否有可能在函数定义中匹配一些touple的子集并且仍然可以在方法中获得完整的操作?

我想做的是这样的事情:

myfun({ foo, Bar }: Var) -> otherfunction(Var, stuff).

而不是:

myfun({ foo, Bar }) -> otherfunction({ foo, Bar }, stuff).

我希望这很清楚。

感谢。

3 个答案:

答案 0 :(得分:6)

您可以通过在前面放置下划线来忽略某些参数。 E.g。

myfun( {foo, _Bar, Var } )

将通过忽略_Bar参数进行匹配。那是你的想法吗?

或者你的意思是:

myfun( {foo, Bar} = Var ) -> otherfun( Var ).

在这种情况下, var 将在 otherfun 中使用,如果与 myfun 的匹配成功。原因是: Var 在评估表达式时是未绑定的,因此将被分配给 {foo,Bar}

答案 1 :(得分:5)

也许这就是你的意思:

myfun({foo, Bar } = Var) ->
  otherfunction(Var, stuff).

这样,您可以将您的函数导出为myfun / 1(一个参数)。它只会在元组上与两个元素匹配。第一个必须是“foo”原子,而第二个可以是任何东西。除非为函数指定不同的子句,否则在所有其他情况下都将获得一个函数子句。例如,拥有:

是有意义的
myfun({foo, Bar } = Var) ->
  otherfunction(Var, stuff);
myfun(Var) ->
  {error, bad_format}.
但是,我并不完全确定这是你所要求的。如果这有帮助,请告诉我。

答案 2 :(得分:-3)

如果我有这个正确的话,你想要的是设置Var,只包含匹配{ foo, Bar }的符号,而不需要做任何额外的检查,为了简洁起见。 就我所见,你不能在Erlang中做到这一点。抱歉。 :)