1. ホーム
  2. functional-programming

[解決済み] ネストされた関数。副作用の不適切な使用?

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 パラメータを使用します。

ただし、ネストされた関数は、親関数の外から参照できないため、個別にテストすることが困難な場合があることに注意してください。