Functional programming Erlang:从函数返回

Functional programming Erlang:从函数返回,functional-programming,erlang,Functional Programming,Erlang,我有一个函数,其中有一系列单独的case语句 case ... of ... end, case ... of ... end, ... 等等 当某个case语句中出现特定case条件时,我希望立即从函数返回,这样就不会检查下一个case语句,函数只会退出/返回。怎么做?Erlang没有返回操作符。您需要将代码重构为更小的函数 原始代码有两个大小写表达式,它们用逗号运算符链接。我想你在第一种情况下有一些副作用,你想保留表达。下面,我使用了一个虚构的返回操作符: case

我有一个函数,其中有一系列单独的case语句

case ... of
     ...
end,

case ... of
     ...
end,

...
等等


当某个case语句中出现特定case条件时,我希望立即从函数返回,这样就不会检查下一个case语句,函数只会退出/返回。怎么做?

Erlang没有
返回操作符。您需要将代码重构为更小的函数

原始代码有两个大小写表达式,它们用逗号运算符链接。我想你在第一种情况下有一些副作用,你想保留表达。下面,我使用了一个虚构的
返回操作符:

case ... of
  P1 -> return E1;
  P2 -> E2;
end,

case ... of
  ...
end
这样的表达式可以使用小函数和模式匹配转换为真正的Erlang代码,类似于:

case1(P1, ...) -> E1;
case1(P2, ...) -> E2, case2(...).
case2(...) -> ...

免责声明:我写Erlang代码已经10年了,所以我的语法可能不正确。

在Erlang中,您只需使用模式匹配来触发相应的函数。如果您有太多的子句需要覆盖和处理,我还建议您稍微重构代码

我建议您进行重构,充分利用Erlang及其模式匹配功能

没有
返回
运算符。另外,一个鲜为人知的事实是,你可以做如下事情:

Return=case。。。属于

case
语句可以有一个“return”值。

使用catch/throw

打电话的人说:

X = (catch foo(A, B)). X=(捕捉foo(A,B))。 然后写

foo(A, B) -> case ... of ...throw(X) .. end, case ... of ... throw (Y) end, ... foo(A,B)-> 案例属于 …掷(X)。。 完,, 案例属于 ... 投掷(Y) 完,, ... 这通常被认为是糟糕的编程实践-因为程序有多个
模式匹配是重构case语句的好方法,您可以这样做

testcase(1, X, Y) -> .... passed1;
testcase(2, X, Y) -> .... passed2;
testcase(N, X, Y) when N > 2 -> .... passedlarge;
testcase(_, X, Y) -> defaultcase.
然后,您的案例陈述简单地总结为:

X = testcase(Number, Param1, Param2).

(在这个精心设计的示例中,X将是passed1、passed2、passedlarge或defaultcase)

一种方法是级联case语句:

my_fun(X) ->
  case cond1(X) of
    true -> ret1;
    _ ->
      case cond2(X) of
        true -> ret2;
        _ ->
          ...
      end
  end.
另一个是将您的案例陈述分为以下几条:

my_fun(X) ->
  my_fun(cond1, X).

my_fun(cond1, X) ->
  case cond1(X) of
    true -> ret1;
    _    -> my_fun(cond2, X)
  end;

my_fun(cond2, X) ->
  case cond2(X) of
    true -> ret2;
    _    -> my_fun(cond3, X)
  end;

...

抛出Erlang专门用于非本地返回,而不是错误处理-因此原则上这是一种有效的方法。在实践中,我怀疑重构来避免它会更好,但如果没有看到代码,就很难知道。原则上,这可能是一种有效的方法,而且确实适用于非局部返回,但在代码中广泛使用它仍然是一种不好的做法。使用非局部返回使其他程序员很难理解代码,也使调试变得更加困难。虽然它不是专门为错误处理而设计的,但是错误处理通常是您应该使用它的唯一地方。此外,如果您是为错误处理而编码,那么您没有遵循核心的Erlang哲学,即“成功的代码”:您的思维更像是一个命令式程序员。这就是为什么它被称为case表达式的原因。@jeffreyveon:我的答案满足您的问题吗?是的,谢谢,感谢您帮助我开始使用erlang:)请提供一个这样做的示例。添加了示例,我希望它能有所帮助。