为了简化问题,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概念,但我想知道哪些以及为什么。
答案 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"的一个共同特征。编程语言。没有程序你可以用早期的回报写出你不能没有它们。