Python はなぜ関数型プログラミングにあまり適していないのでしょうか? [closed] 質問する

Python はなぜ関数型プログラミングにあまり適していないのでしょうか? [closed] 質問する

私は関数型プログラミングはPythonでできるとずっと思っていました。そのため、Pythonがあまり言及されていないことに驚きました。これ質問はありましたが、言及されたとしても、通常はあまり肯定的ではありませんでした。しかし、その理由はあまり示されていませんでした (パターン マッチングと代数的データ型の欠如が言及されていました)。そこで私の質問は、なぜ Python は関数型プログラミングにあまり適していないのかということです。パターン マッチングと代数的データ型の欠如以外にも理由があるのでしょうか。それとも、これらの概念は関数型プログラミングにとって非常に重要なので、それらをサポートしない言語は二流の関数型プログラミング言語としてしか分類できないのでしょうか。(関数型プログラミングに関する私の経験は非常に限られていることに注意してください。)

ベストアンサー1

あなたが参照している質問は、どの言語が OO と関数型プログラミングの両方を促進するかを尋ねています。Python は、かなりうまく機能するにもかかわらず、関数型プログラミングを促進しません。

Pythonの関数型プログラミングに対する最大の反論は、命令型/オブジェクト指向のユースケースはGuidoによって慎重に考慮されているのに対し、関数型プログラミングのユースケースは考慮されていないということだ。命令型のPythonを書くと、私が知る限り最も美しい言語の1つになる。関数型のPythonを書くと、それは、BDFL

これは悪いことではなく、関数型プログラミングを推進する言語に切り替えたり、OO Python の記述に切り替えたりした場合よりも、より一生懸命に作業する必要があるということです。

Python で私が懐かしく思う機能は次のとおりです。


  • パターン マッチングと末尾再帰がないため、基本的なアルゴリズムは命令的に記述する必要があります。Python では再帰は見苦しく、遅くなります。
  • リストライブラリが小さく、機能的な辞書がないため、多くのものを自分で記述する必要があります。
  • カリー化や合成のための構文がないので、ポイントフリー スタイルでは、引数を明示的に渡す場合と同じくらい句読点が多くなります。
  • 遅延リストの代わりにイテレータを使用するということは、効率性と永続性のどちらが必要かを把握し、list永続性が必要な場合は呼び出しを分散させる必要があることを意味します。(イテレータは 1 回だけ使用されます)
  • Python のシンプルな命令型構文とシンプルな LL1 パーサーにより、if 式とラムダ式のより優れた構文は基本的に不可能になります。Guido はこの方法を好んでおり、私も彼の言う通りだと思います。

おすすめ記事