为什么Elixir没有回复声明

时间:2017-01-07 09:42:19

标签: elixir

为了简化问题,Elixir和一些(大多数?全部?)函数式语言中没有return语句的原因是什么?

为了让它更长一些,我面临的情况是Java,Groovy,C,Ruby ......我会写一些像

这样的东西
def func (some, parameters) {

  # say some error
  if(condition 1) {
    return -1
  }

  # execute some function and return from here the result
  if(condition 2) {
    return process1(params)
  }

  # execute 'default' behavior when no condition matches and return result
  process2(params)
}

当然,这可以写成嵌套的if,但如果条件列表很长,代码就会变得不可读。

我读了 Return statement in Elixir 这个问题的答案:他们清楚地解释了如何实现这种模式,但没有解释没有return的原因。

我相信让return打破一些FP概念,但我想知道哪些以及为什么。

2 个答案:

答案 0 :(得分:5)

因为有其他方法可以做同样的事情,更像是Elixir。

多个功能头与您正在做的事情基本相同:

defp merge_sweep(a, [], _) when is_list(a), do: a
defp merge_sweep([], b, _) when is_list(b), do: b
defp merge_sweep([a|as], [b|bs], cmp) do
  if cmp.(a, b) do
    [a|merge_sweep(as, [b|bs], cmp)]
  else
    [b|merge_sweep([a|as], bs, cmp)]
  end
end

由于函数式编程中的函数没有任何副作用(暂时忽略:ets),为什么要在任何地方编写return?你总是希望在每个分支中返回一些东西,所以你也可以总是返回每个分支中的最后一个表达式。

当我开始时,我在Elixir中询问Golang的defer声明,因为我来自Go。只是每种语言都有不同的做事方式。 在Python中编写类似C的代码看起来很怪异和外来。

真正的答案可能是"因为Erlang没有"。

答案 1 :(得分:2)

简短的回答是因为Erlang没有早期回报。

更长的答案是因为早期退货是一种反模式,它们会使您的代码难以阅读和推理。它与函数式编程没有任何关系,除了它是" functional"的一个共同特征。编程语言。没有程序你可以用早期的回报写出你不能没有它们。