2017-02-13 16 views
-1

私は関数プログラミングを学んでいます。なぜ不変性が可変オブジェクトよりも好まれるのか理解できます。なぜ関数代入が関数プログラミングで使われるべきでないのですか

This記事でもよく説明しています。

しかし、なぜ純粋な関数の中で代入を行うべきか理解できません。

私が理解できる1つの理由は、変数の可変性がロックにつながり、スカラの純関数ではテール再帰がほとんどであり、ヒープではなく呼び出しスタック上に変数/オブジェクトを作成するからです。

なぜ機能プログラミングにおける変数の割り当てを避けるべき他の理由はありますか?

+1

純粋な関数は、与えられたパラメータにのみ依存します。つまり、同じパラメータで呼び出すたびに同じ結果が返されます。関数が関数の外で定義された変数を使用する場合、毎回同じ結果を返しません。それは変数に依存します! – marstran

+0

http://stackoverflow.com/questions/1791408/what-is-the-difference-between-a-var-and-val-definition-in-scala – nmat

+0

変数が関数に対してローカルな場合はどうなりますか他の場所では使用されていませんか? –

答えて

1

割り当てと再割り当てには違いがあります。純粋な関数ではその変更が許可されていないので、再割り当ては関数型プログラミングでは許可されません。可変代入が許可されています。

val a = 1 //assignment allowed 

val a = 2 //re-assignment not allowed 

外部世界からの不正な方法(状態の変更)での読み込みは、関数型プログラミングの副作用です。

したがって、突然変異する可能性のあるグローバル変数にアクセスする関数は純粋ではありません。

ちょうど人生を楽にします。

一般

あなたが規律している人生はそれほど混沌です。関数プログラミングが主張しているものとまったく同じです。人生が混沌としていないときは、より良いものに集中することができます。

ので、不変

の主な理由は、それは変異を有するプログラムの正しさを推論することが困難となります。並行プログラムの場合、これはデバッグするのに非常に苦労します。それは変数がコード/プログラムを理解するか、プログラムをデバッグするために受ける変化を追跡するのが困難となること

突然変異は、プログラムを分かりにくくしてしまう理由の一つです。

機能プログラミングでは、この規律(不変性の使用)が実施され、コードは保守可能で、表現力豊かで理解しやすいものになっています。

変異は

純粋関数が副作用を持っていない1つである、副作用の一つです。

副作用:変数の

  1. 変異可変データ構造の
  2. 変異
  3. 読み取りまたはファイル/コンソールへの書き込み(外部ソース)停止プログラムの例外を投げる

上記の副作用を回避すると、関数は関数のパラメータのみに依存しますnは外部の値や状態ではなく、

純粋な関数は、世界から読み込むことも、世界に書き込むこともない最も孤立した関数です。プログラム制御フローを停止または中断しません。

上記の特性により、純粋な関数が理解しやすくなり、その理由がわかりやすくなります。

純粋関数は、数学関数にある

そのコドメイン内のすべての値が範囲内の1つの値にマップされている範囲に共同ドメインからのマッピング。

つまり、f(2)が4に等しい場合、f(2)は世界の状態に関係なく4です。

純粋な関数は、入力のセットと許容可能な出力のセットの間の関係であり、各入力は正確に1つの出力に関連しています。

関連する問題