Erlang模式与函数匹配

时间:2011-07-05 17:07:04

标签: function erlang pattern-matching

由于Erlang是一种几乎纯粹的函数式编程语言,我认为这是可能的:

case X of
    foo(Z) -> ...
end.

其中foo(Z)可判定可逆的纯(无副作用)双射函数,例如:

foo(input) -> output.

然后,如果X = outputZ匹配为input

在Erlang中是否可以使用这种语义,有或没有我的例子的其他语法?

4 个答案:

答案 0 :(得分:4)

不,你想要的是不可能的。

要做这样的事情,你需要能够找到任何双射函数的逆,这显然是不可判定的。

答案 1 :(得分:2)

我想不允许这样做的原因是你想要保证缺乏副作用。鉴于以下结构:

case Expr of
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end

评估Expr后,模式会按照Expr的结果顺序匹配。想象一下,您的foo/1函数包含副作用(例如,它发送消息):

foo(input) ->
  some_process ! some_msg,
  output.

即使第一个模式不匹配,您仍然会发送消息,但无法从那种情况中恢复。

答案 2 :(得分:1)

你能做的是:

Y = foo(Z),
case X of
  Y -> ...
end.

答案 3 :(得分:1)

不,Erlang只支持文字模式!

您的原始请求并不容易。仅仅因为存在反转并不意味着它很容易找到。实际上,编译器必须制作两个版本的函数。