[解決済み] これは純関数ですか?
質問
ほとんどの場合 ソース は、次の2つの特性を持つものとして純粋関数を定義しています。
- その戻り値は同じ引数に対して同じである。
- 評価には副作用がない。
気になるのは最初の条件です。ほとんどの場合、判断は簡単です。次のようなJavaScriptの関数を考えてみてください(表示されている この記事 )
ピュアです。
const add = (x, y) => x + y;
add(2, 4); // 6
不純です。
let x = 2;
const add = (y) => {
return x += y;
};
add(4); // x === 6 (the first time)
add(4); // x === 10 (the second time)
2番目の関数がそれ以降の呼び出しで異なる出力をすること、それによって最初の条件に違反することは容易に理解できます。したがって、それは不純物です。
この部分はわかった。
さて、私の質問のために、ドルでの与えられた金額をユーロに変換するこの関数を考えてみましょう。
(編集 - 使用する
const
を1行目で使っています。使用されている
let
をうっかり使ってしまいました(笑)。
const exchangeRate = fetchFromDatabase(); // evaluates to say 0.9 for today;
const dollarToEuro = (x) => {
return x * exchangeRate;
};
dollarToEuro(100) //90 today
dollarToEuro(100) //something else tomorrow
為替レートをDBから取得し、それが毎日変化すると仮定します。
さて、この関数を何度呼び出しても
今日
を何度呼び出しても同じ出力が得られます。
100
. しかし、明日には違う出力が得られるかもしれません。これが最初の条件に違反するかどうかはわかりません。
つまり、関数自体は入力を変化させるロジックを含んでいませんが、将来変化するかもしれない外部の定数に依存しているのです。この場合、毎日変更されることは絶対確実です。他のケースでは、それは起こるかもしれないし、起こらないかもしれません。
このような関数を純粋関数と呼ぶことはできるのでしょうか。もし答えがNOであれば、どのようにリファクタリングして1つにすることができるでしょうか?
どのように解決するのですか?
この
dollarToEuro
の戻り値は引数ではない外部変数に依存します。したがって、この関数は不純物です。
答えがNOの場合、どのように関数をリファクタリングすれば純粋になるのでしょうか?
一つの選択肢は
exchangeRate
. この方法では、引数が毎回
(something, somethingElse)
である場合、出力は
保証
であることが
something * somethingElse
:
const exchangeRate = fetchFromDatabase(); // evaluates to say 0.9 for today;
const dollarToEuro = (x, exchangeRate) => {
return x * exchangeRate;
};
なお、関数型プログラミングでは
let
- を使うべきです。
const
を使ってください。
関連
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] セレクタの子を取得する方法は?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] オブジェクトのためのマップ関数(配列の代わりに)
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】参照透過性とは何ですか?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] オブジェクト作成時のJavascript "Not a Constructor" Exceptionについて