2016-11-28 17 views
14

私は経験豊富なOOPプログラマー(主にC++)です。今では機能プログラミングを始めています。私の理解から、純粋に機能的なパラダイムでは、関数は条件付きであってはならず、カリングを使用して可能な限り分解されるべきです。誰かが私に次の例の "純粋な"機能バージョンを提供できますか?好ましくは、機能的なパラダイムの一部となる厳密な技術をすべて使用する。Purely Functional Programming

let rec greatestCommonFactor a b = 
    if a = 0 then b 
    elif a < b then greatestCommonFactor a (b - a) 
    else greatestCommonFactor (a - b) b 
+2

ようこそスタックオーバーフロー!質問をする前に[ヘルプセンター](http://stackoverflow.com/help)をよく読んでいただきありがとうございます。これは最初の優れた質問でした。明快で簡潔で、必要な詳細を正確に、無関係な言葉を使わずに。もし私ができればあなたの質問を5倍upvoteしたいと思います。よくやった! – rmunn

答えて

16

あなたが提供した機能例は、すでに純粋に機能している。関数の純度について言えば、実際には関数の性質はreferentially transparentです。

式の値をプログラムの効果を変えずに置き換えることができれば、表現は明確に透明です。簡単な例を与えるために、機能を想像:

let add2 x = x + 2 

は今、どこにでも値add2 2は、私たちのプログラムに表示されていることを、我々はプログラムの動作を変更することなく、値4を置き換えることができます。

我々は、コンソールに表示する関数の中にいくつかの追加の動作を追加することを今想像:

let add2Print x = 
    printfn "%d" x 
    x + 2 

関数の結果は前と同じですが、私たちはもはや値と値の代入を行うことはできません4は、我々のプログラムの動作を変更することなく、コンソールに印刷するという副次的な効果があるためです。

この機能は、もはや参照性がなく、したがって純粋な機能ではありません。あなたが供給しているこの機能を見てみると


let rec greatestCommonFactor a b = 
    if a = 0 then b 
    elif a < b then greatestCommonFactor a (b - a) 
    else greatestCommonFactor (a - b) b 

、何の副作用は、その実行に関与していません。与えられた入力に対して同じ出力値を常に得ます。したがって、これはすでに純粋な関数です。abです。

明確にするために、関数型プログラミングでは条件付きの関数には全く問題はありません。しかし、多くの場合、if/elif/else式ではなくパターンマッチングを使用しますが、記述した例では純粋に文体です。パターンマッチングを使用する関数の別の表現は、次のようになります。

let rec greatestCommonFactor a b = 
    match a with 
    |0 -> b 
    |a' when a' < b -> greatestCommonFactor a' (b - a') 
    |a' -> greatestCommonFactor (a' - b) b 
+2

したがって条件は関係ありませんか?私は、機能的パラダイムにおいて条件付きの排除が好まれているという印象を受けていました。その場所にラムダを使用するなど。 – Zach

+4

@ Zach一部の関数型言語は簡潔なスタイルに向いていますが、条件式はまだ存在します。 Haskellでも 'if'キーワードがありますが、F#の場合と同様に、' if'と 'then'よりもパターンマッチングを使う傾向があります。 –

+5

@Zachいいえ、条件は絶対に関係ありません。関数型プログラミングの条件文は、 'if/elif/else'式ではなくパターンマッチングによって処理されることがよくありますが、ここで紹介した場合は純粋に文体です。 – TheInnerLight

関連する問題