7

私のPython学習本で、私がについて読んだときList Comprehension、著者は次のことを説明する小さなメモを持っています。

Pythonのリスト内包表記は、関数型プログラミングの概念に対する言語のサポートの一例です。

関数型プログラミングについて読むためにウィキペディアに行きました。List Comprehensionしかし、説明されているwikiページには、この概念との間に関連性が見当たらないため、想像するのは難しいです。

明確な説明を教えてください(可能であれば、JavaまたはC#での関数型プログラミングについての例もいくつか教えてください:D)

4

5 に答える 5

7

あなたの質問が「PythonでFPがどのように機能するかを示すいくつかの例を教えてください」である場合、次のようになります。

純粋関数型プログラミング(Python)とは何ですか?

これは、状態データと可変データを回避し、代わりに関数の戻り値に依存するプログラミングパラダイムです。これは、Pythonで記述された純粋に関数型のプログラムには、変数や状態などがないことを意味します。

それほど純粋ではないFP

FPと命令型パラダイムを組み合わせて、良好な結果を得ることができます(ここを参照)。リンクされた要点は、数か月前に受講したPythonクラス用に作成した数学クイズプログラムです。コードを自由に使ってください。

Java / C#のFP

私は個人的にC#の経験がないので、他の誰かがC#の例を投稿する必要がありますが、JavaでFPを使用することはできますが、純粋なFPを使用することはできません。例 :

int fib (int x) { 
    if (x < 2) return x;
    return fib (x-1) + fib(x-2);
}

上記の方法は完全にFPですが、Javaを使用する場合は純粋なFPコンテキストでは使用できません。これはJavaのクラス内に配置する必要があり、そのタイプのオブジェクトをインスタンス化した後にCのみ呼び出すことができます。この最後の部分では、JavaクラスがFPであることが失格になりますが、メソッドは引き続き失格になります。C

編集:実際には、インスタンス化せずに使用できる静的メソッドをJavaで使用できます。したがって、シグニチャをに変更したstatic int fib (int x)場合、FP方式で呼び出された場合、メソッドとそのメソッド呼び出しは引き続きFPになる可能性があります。


Re:あなたのコメント

再帰はFPである可能性がありますが、そうである必要はありません(以下を参照)。

def f(first, rest):
    print first
    first = rest[0]; rest = rest[1:]
    f(first, rest)

再帰なしでFPを使用することもできます:

 def sum (a,b):
     return a+b

 def square(c):
     return c*c

 def square_of_sum (x,y):
     return square(sum(x,y))
于 2012-06-12T11:25:34.517 に答える
5

Pythonのmap()、reduce()、filter()はシーケンスを取得し、選択した別の関数を適用してから、元のシーケンスをそのままにして別のシーケンスを返します。

元のシーケンスに触れず、内部的にその状態に触れず、副作用を引き起こさないため、これは機能的であると言えます。(あなた自身がそれに提供する機能は、副作用を生み出すなど、上記のいくつかを行うことができますが)

関数型プログラミングは、副作用(別の静的な場所またはプロセスで値を直接変更する)によって引き起こされるエラーを減らし、共有データへのアクセスを同期する必要性を減らすかなくすために、アプリケーションをプログラミングおよび構造化する別の方法です。erlangのように、一部の言語ではこれを強制しますが、他の言語では、 scalaなどのプログラミングスペクトルの機能面を優先して、その時点で最適なパス(手続き型または機能型)を選択する必要があります。

于 2012-06-09T10:19:54.460 に答える
4

Pythonのリスト内包表記は、Haskell(非常に「純粋な」関数型言語)から直接取得されていると思います。

Haskell:

[ x | x <- [1..10] ]

Python:

[ x for x in range(1,11) ]

人々が言及しているように、Pythonは、、、などの機能的な概念を許可map()reduce()ますlambda

これらはすべて機能的なアイデアですが、Pythonは再帰に対応していないため、純粋に機能的な方法で使用できることはめったにありません。

「関数型」言語について知りたい場合は、「Haskell」、「Scala」、「Clojure」、「Erlang」、「F#」などを調べてください。ケース)

また、関数型プログラミングとは何かを本当に理解したい場合は、こちらをご覧ください。読みやすく、素敵な写真があり、目を開ける素晴らしい善のためのハスケルを学びましょう。

編集 -

Haskellの階乗関数の例(すべて同じことをします):

fact1 0 = 1
fact1 n = n * fact1 (n - 1)


fact2 n | n == 0 = 1
        | otherwise = n * fact2 (n - 1)


fact3 n = case n of
            0 -> 1
            _ -> n * fact3 (n - 1)

ps、この質問と関連性を見てください。

于 2012-06-09T17:58:50.450 に答える
1

他の人が私よりもうまく説明できると確信していますが、関数型プログラミングは主に、プログラムのフローをどのように考えるか、および関数を計算対象として渡すことができるかどうかに関係しています。たとえば、JavaScriptでは、偶数が起動したときに実行される関数を提供すると、これは関数を渡します。この意味では、関数型プログラミングとほとんど同じです。

これは、リスト内包表記が関数型プログラミングに似ているという意味です。関数として渡すのではなく、ループして自分で計算を行うという、より手続き的なアプローチではなく、各要素の計算方法を指示しているからです。Pythonは、LISP、ML、Haskellのような真の関数型プログラミング言語とは言えませんが(erlangですか?覚えていません)、そのようなことはできます(Pythonのラムダ式を調べてください)。

JavaとC/C ++も実際には機能しませんが、引数として関数ポインターを使用してシミュレートできます。C#にあまり詳しくない...

イベント駆動型言語は、後日実行される未知のコードを渡すための何らかの方法が必要であるという理由だけで、関数を渡すというこのアイデアを利用する傾向があります。

于 2012-06-09T10:15:36.757 に答える
0

シンプル私は、MapとReduceという用語はLispと関数型プログラミングに由来すると思います。

そしてPythonは

フィルタ、マッピング、削減

参照:http://www.joelonsoftware.com/items/2006/08/01.html

 http://docs.python.org/tutorial/datastructures.html
于 2012-06-09T12:10:54.777 に答える