[解決済み] ネストされた関数。副作用の不適切な使用?
2022-02-18 10:28:51
質問事項
私は関数型プログラミングを学んでおり、いくつかの問題を関数型スタイルで解決しようとしました。問題を関数に分割する際に経験したことの1つは、2つの選択肢があるように思えたことです。それは、類似のパラメータリストを持つ複数の異なる関数を使用するか、またはクロージャとして、単に親関数の結合を参照できる入れ子関数を使用するか、です。
結局、関数の呼び出しが少なくてすむし、気分的にも楽なので、2番目の方法を選んだのですが、読んでみると、関数型プログラミングの主要なポイントの1つを見逃しているような気がします。しかし、個々の内部関数を見ると、親スコープからの変数を使用しているので、「同じパラメータを与えると、この関数は同じ結果を返します」とは言えませんよね?
どのような進め方が望ましいのでしょうか?
ありがとうございます。
解決方法は?
関数のネストは、多くの関数で分業するための優れた方法です。この方法は本当に副作用があるわけではありません。
ネストされた関数が便利な例として、ループの置き換えがあります。ネストした関数のパラメータは、値を蓄積する誘導変数として機能させることができます。簡単な例を挙げます。
let factorial n =
let rec facHelper p n =
if n = 1 then p else facHelper (p*n) (n-1)
in
facHelper 1 n
この場合、以下のような関数を宣言するのはあまり意味がないでしょう。
facHelper
というのは、ユーザーは
p
パラメータを使用します。
ただし、ネストされた関数は、親関数の外から参照できないため、個別にテストすることが困難な場合があることに注意してください。
関連
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] JavaScript のネストしたオブジェクトや配列に文字列パスでアクセスする
-
[解決済み] クロージャ」とは何ですか?
-
[解決済み] Y-combinatorとは?[クローズド]
-
[解決済み】ネストされたJavaScriptオブジェクトのキーが存在するかどうかをテストする
-
[解決済み】参照透過性とは何ですか?
-
[解決済み】関数型プログラミングで、ファンクターとは何ですか?
-
[解決済み] ステートレス・プログラミングのメリット?
-
[解決済み] ヒンドレーミルナーとは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 関数型言語における「パターンマッチング」とは?
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] 関数型プログラミングで時間関数が存在するのはなぜですか?
-
[解決済み】参照透過性とは何ですか?
-
[解決済み】ミュータブルステートなしで何か役に立つことができるのか?
-
[解決済み】関数型プログラミングのソフトウェア工学の方法論はありますか?[クローズド]
-
[解決済み】手続き型プログラミングと関数型プログラミングの違いは何ですか?[クローズド]
-
[解決済み] ステートレス・プログラミングのメリット?
-
[解決済み] First Class FunctionとHigh Order Functionの違いについて
-
[解決済み] ヒンドレーミルナーとは?