2013-06-03 22 views
9

私はこの記事を読んでいます:http://en.wikipedia.org/wiki/Function_pointerと混乱しています。 C/C++は関数ポインタをサポートしているので、一般的に関数型プログラミングをサポートしているわけではありませんか?私は実際には関数型プログラミングのためにCやC++を使いたいとは思っていませんが、CやC++がそのようなことをサポートしていることは聞いたことがないので興味があります。 (私は多くの関数型プログラミング言語のコンパイラがC言語に存在することを知っていますが、それは実際には "サポート"という意味ではありません)。C/C++での関数型プログラミング?

+0

@cdbitesky、私は少し不公平だと思います。問題は、一般的に関数型プログラミングを許可する際に関数ポインタの役割を確認しようとする場合に比較的正確です。明らかに、「関数型プログラミング」の技術的定義については少し戸惑うことがありますが、私はこれを私の答えに取り組んだと思います。 – Gian

答えて

7

編集:なぜこの回答が大嫌いになるのかわかりません。質問は具体的に関数ポインタについて質問し、その存在がC++が「一般的な関数型プログラミング」をサポートしているかどうかを質問します。

技術的なものではありませんが、非常に有用な方法です:はい*。 「機能的」プログラミングの本質は、機能が価値であることです。 CとC++は、lexical closuresの簡単な作成と破壊のようなものに関しては何の助けもしません。また、partial applicationの面であなたに何も寄与しません。関数ポインタを使ってちょうど値のように振る舞う関数の出現をシミュレートできるという事実は、実際には同等の表現言語の結果です。これを "関数型プログラミング"と組み合わせようとすると、本当にチューリング・タピットの深いところまで広がっています。

*本当に技術的には、CとC++には実際には関数型のの値はではありません。関数ポインタは、関数値とは区別されます。

+1

ファンクタはどうですか?それらはSTLを使用する標準的な方法です。 C++ 11では単相性のラムダがあり、C++ 14では汎用ラムダがあります。 – gnzlbg

+2

私の答えをC++ 14のfalseとして解釈することができます。質問は関数ポインタに関するものでした。 – Gian

14

機能プログラミング(実際に興味がある場合はそれを見てください)は、関数ポインタやそれらの欠如とはほとんど関係がありません。

C++は、特に後のバージョンのFPを多大にサポートするマルチパラダイム言語です。 FPのようなWG21で働く多くの人々がサポートを求めています。 C++ 11では、ラムダとC++ 14の多型ラムダのデビューを得ました。それは多くのものをカバーします。機能は第二クラスの市民にとどまりますが、ラムダは罰金を引き受けることができます。

残念ながら、末尾再帰処理は依然として必須ではありませんが、コンパイラは実際にそれを処理し、最後の10年では単にconst過負荷を混乱させたときに便利に "無限再帰"を報告します。 :)

C++でFPスタイルを使ってかなり遠くに行くことができます。これを学ぶことで、他のスタイルを選択したときでもより良いコードを作成できます。私は誰もがSICPを勉強することをお勧めします。

+0

私は実際にOCamlを学びたいと思っています。それが私のWikipediaを探究し、関数ポインタを渡ってきたのです。私は実際のプログラミングが何であるかを実際に理解することなくこの質問をして銃を飛ばしたと思う。 – user2258552

4

C++で関数型プログラミングを行うことはできますが、言語は正確には役に立ちません。可能な限り不変の値を単純に使用するファーストオーダーの関数型プログラミングは確かに簡単ですが、それほど簡単ではありませんが、実際にはmonadsを実装することができます!