2017-01-07 47 views
2

質問を短くするには、Elixirといくつかの(ほとんどすべての)関数型言語にreturn文がない理由は何ですか?それは少し長くするなぜ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の概念を破ると思います。

+1

FYIエリクシールにネストされた 'if'の代わりに' cond'を使うことができます。 'cond'では、あなたが書いたコードと比べてインデントの余裕度が1つ以上あることはありません(最後のステートメント群についても同じです)。 – Dogbert

+1

また、 'with'を使うこともできます。これは、いくつかの状況で非常に便利で、コードを読みやすく素敵にすることができます。しかし、私はなぜリターンステートメントが組み込まれていないのか興味があります。 – JustMichael

+0

あなたはかなり広い質問をしています。これについての議論があります:http://wiki.c2.com/?SingleFunctionExitPoint他の場所です。私はこれを閉鎖するか、Programmer's Stack Exchangeに移動する必要があると言いたいと思います。 –

答えて

4

エリクサーのように同じことをするための他の方法があるので。

多機能ヘッドは基本的に何をやっていると同じことを実行します。

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と書かなければなりませんか?すべてのブランチで常に何かを返すことが必要なので、各ブランチの最後の式を常に返すこともできます。

私はGoilから来たので、私が始めたときにElixirのGolangのdeferの声明を聞いた。それぞれの言語には異なる方法があります。 PythonでCのようなコードを書いているだけで、奇妙で外見に見えます。


実際の答えはおそらく「Erlangがそうしないため」です。

2

Erlangが早期返品をしていないため、短い答えがあります。

早いリターンは反パターンであり、コードを読みやすくして理由を説明しにくくするためです。関数型プログラミング言語の共通の機能以外の関数型プログラミングとは関係ありません。あなたがそれらなしですることができない早期返品で書くことができるプログラムはありません。

+1

この回答は私にとって独断的です。読みやすさについての意見は様々ですが、元の質問はネストされた 'if'がより読みやすくなるのを避けようとしていました。ガード句はより慣用的で、私はより読みやすいと思います。 (フィリップの答えは私にとって印に近い) – cleaver

+0

@cleaverプログラミング言語は非常に独断的です – greg

関連する問題