あなたが提供した機能例は、すでに純粋に機能している。関数の純度について言えば、実際には関数の性質は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
、何の副作用は、その実行に関与していません。与えられた入力に対して同じ出力値を常に得ます。したがって、これはすでに純粋な関数です。a
とb
です。
明確にするために、関数型プログラミングでは条件付きの関数には全く問題はありません。しかし、多くの場合、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
ようこそスタックオーバーフロー!質問をする前に[ヘルプセンター](http://stackoverflow.com/help)をよく読んでいただきありがとうございます。これは最初の優れた質問でした。明快で簡潔で、必要な詳細を正確に、無関係な言葉を使わずに。もし私ができればあなたの質問を5倍upvoteしたいと思います。よくやった! – rmunn