2009-04-28 4 views
1

私は、関数型プログラミングの世界を掘り下げ始めました。MapやReduceのような概念はすべてのFunctional Programming Languagesに適用されますか?

継承や多相などの多くのOOP(オブジェクト指向プログラミング)の概念は、C#、Java、VB.NETなどのほとんどの現代OO言語に適用されます。

しかし、Map、Reduce、Tuples、Setsなどの概念はどのようにすべてのFP(Functional Programming)言語に適用されますか?

私はF#で始まったばかりです。しかし、前述の概念はHaskell、Nemerle、Lispなどの他のFPにも当てはまりますか?

+0

多型は、OOの概念ではありません。これは、さまざまな "実装"が多い一般的な概念です。おそらくあなたが参照しているのは "サブタイプ多型"です。例えば、機能的言語は "パラメトリック多型"または "アドホック多型"を使用しています。 –

答えて

6

賭けてください。関数プログラミングの望ましいことは、記述する数学的概念がより自然にFPで表現されることです。

これはちょっと難しいですが、John BackusのTuring Award paperでは、機能的(または「応用的」)なプログラミングがうまく説明されています。 Wikipedia articleも良いです。

+0

@Charlie:私の現在の状態で私のために飲み込むのはちょっと難しいです。しかし、私は実際に学ぶために時間を費やすことができる何かのように見えます。ありがとう。 – Sung

+0

「私を殺さないものは、私を強くします。」 ;-) –

+0

@Charlie:私はそれが辛い食べ物だけに適用されたと思った;) – Sung

2

はい。代数データ型、折り畳み/変形変態などはほとんどすべての関数型言語に共通しています(ただし、各言語でわずかに異なる名前が使われることがあります)。

2

機能ツールは、それを明示的に処理する言語だけでなく、すべてのプログラミングに適用されます。たとえば、Pythonにはmapreduceの組み込み関数が用意されています。本当に巧妙になるには、マルチプロセッシングモジュールのようなものが必要です。

言語が正確なプリミティブを提供しないとしても、ほとんどの現代の言語は、依然としてもう少しの作業で所望の効果を得ることができます。これは、純粋なC言語でクラスのような概念をコード化する方法に似ています。

+0

+1 "ほとんどの現代の言語は、もう少しの作業でも望ましい効果を得ることができます" < - With C#私はMap&Reduceを実装することができますが、コードはかなり毛深くなります。 – Sung

+0

Turingの完全な言語(OokとBrainfuckを含むCプリプロセッサ以外のほとんどすべて)は可能でしょうか? –

+1

明らかに、チューリングトラップが達成できなかった関数型プログラミングによって推論される計算力はありません。実際のメリットは、言語の表現力とオペレータの効率的な実装の特徴です。効率的で理解しやすい方法でアクションを実行するためにチューリングトラップ言語を取得することは非常に困難です。 – SingleNegationElimination

0

"マップ"、 "縮小"できるデータ型、つまりマップ、配列/ベクトル、またはリスト。

すべてのデータ構造が関数アプリケーションによって定義されている "純粋なラムダ計算"言語では、もちろん関数を並列に適用することができます(つまり、fn(expr1、expr2)を呼び出して)expr1とexpr2並行して)、それは実際にmap/reduceが何であるかではありません。

2

高次関数(map、reduce、filter、...)と不変のデータ構造(タプル、コンスリスト、レコード、マップ、セットなど)は、 )共通のFP言語で共通ですか?私は、絶対にはいと言うでしょう。

OOPにはよく知られている柱(カプセル化、継承、多型)があります。関数型プログラミングの "柱"は、1)関数をファーストクラスの値として使用し、2)副作用なしに自分自身を表現することです。

これらのアイデアをさまざまなFP言語(F#は優れた選択肢です!)に適用するための一般的なツールがあり、より多くの主流言語に対応しています。 LINQのSelect = map、Aggregate = reduce/fold、Where =フィルタ、C#には軽量のラムダ構文、System.Tupleなどがあります。

非明示的なFP言語には一般的に見当たらないものは、(ライブラリだけでなく)それらのための良い不変のデータ構造と構文サポートであり、そのためにピラー#2に固執しにくいそれらの言語。 F#リスト、レコード、タプルなどはすべて、これに対する素晴らしい言語とライブラリの組み合わせの良い例です。

関連する問題