Function 基于函数的Erlang模式匹配

Function 基于函数的Erlang模式匹配,function,erlang,pattern-matching,Function,Erlang,Pattern Matching,由于Erlang几乎是一种纯函数式编程语言,我认为这是可能的: case X of foo(Z) -> ... end. 其中,foo(Z)是一个可判定的可逆纯(无副作用)双射函数,例如: foo(input) -> output. 然后,在X=output的情况下,Z将匹配为input 在Erlang中是否可以使用这样的语义,无论是否使用我的示例以外的其他语法?不,您想要的是不可能的 要做到这一点,你需要能够找到任何双射函数的倒数,这显然是不可判定的。我想不允许这样做的

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

case X of
    foo(Z) -> ...
end.
其中,
foo(Z)
是一个可判定的可逆纯(无副作用)双射函数,例如:

foo(input) -> output.
然后,在
X=output
的情况下,
Z
将匹配为
input


在Erlang中是否可以使用这样的语义,无论是否使用我的示例以外的其他语法?

不,您想要的是不可能的


要做到这一点,你需要能够找到任何双射函数的倒数,这显然是不可判定的。

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

case Expr of
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end
计算
Expr
后,模式将按顺序与
Expr
的结果匹配。假设您的
foo/1
函数包含副作用(例如,它发送消息):

即使第一个模式不匹配,您也会发送消息,并且无法从该情况中恢复。

您可以做的是:

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

不,Erlang只支持文字模式


你最初的要求并不容易。仅仅因为有一个倒数并不意味着它很容易找到。实际上,编译器必须生成两个版本的函数。

@Pindatjuh:我知道什么是双射函数。但仅仅因为每个双射函数都有一个逆函数并不意味着你可以编写一个算法来找到它(你不能)。我将编辑这个问题:一个可逆的纯双射函数。这需要你知道Z的值。我很确定这不是OP的意图。好吧,如果用
foo\u inverse
替换
foo\u,这是有意义的。然而,正如sepp2k所说,这不是我的本意。谢谢,但我的意思是“纯功能”不允许有副作用。我会修改这个问题,我明白。但问题是,当函数是用户定义的时,如何确保它是纯函数。
Y = foo(Z),
case X of
  Y -> ...
end.