【问题标题】:Erlang pattern matching with functionsErlang 模式匹配函数
【发布时间】:2011-09-29 00:00:36
【问题描述】:

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

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

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

foo(input) -> output.

那么,如果X = outputZ 将匹配为input

是否可以在 Erlang 中使用这样的语义,有或没有我的示例之外的其他语法?

【问题讨论】:

    标签: function erlang pattern-matching


    【解决方案1】:

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

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

    【讨论】:

    • @Pindatjuh:我知道什么是双射函数。但是仅仅因为每个双射函数都有一个逆函数并不意味着你可以编写一个算法来找到它(你不能)。
    • 我将编辑问题:一个可逆的纯双射函数。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 谢谢,但是我的意思是“纯功能”是不允许有副作用的。我将编辑问题。
    • 我明白这一点。然而,问题是如何确保函数是纯的,当它是用户定义的时候。
    【解决方案3】:

    不,Erlang 只支持文字模式!

    而您最初的要求并不容易。仅仅因为存在逆并不意味着它很容易找到。实际上,编译器必须制作两个版本的函数。

    【讨论】:

      【解决方案4】:

      你可以做的是:

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

      【讨论】:

      • 这需要你知道 Z 的值。我很确定这不是 OP 的意图。
      • 好吧,如果将foo 替换为foo_inverse,这是有道理的。然而,正如 sepp2k 所说,这不是我想要的。
      猜你喜欢
      • 2014-06-27
      • 2023-03-26
      • 2018-12-08
      • 2011-08-14
      • 2011-06-17
      • 2013-08-15
      • 2010-12-13
      • 2014-07-26
      • 2015-01-12
      相关资源
      最近更新 更多