0

関数型プログラミング(スキーム)を学び始めたところです。しかし、私はまだ「機能的に」考えるのに問題があります。

何かのようなもの:

func1(int a){
   if(a==100)
      a=0;
   return func2(a);
}

そこには状態変化があるので、それは命令型プログラミングです。

「if」の部分を別の関数にスローすると、それは機能的になりますか?

func1(int a){
   return func2(func3(a));
}

これがすべてなのか?

ありがとう!

4

1 に答える 1

4

あまり。まず、関数型プログラミングの意味にはいくつかの異なる定義があり、コミュニティによって異なります。Haskellersは、通常、Schemersとは少し異なる考え方を持っています。

厳密に言えば、関数型プログラミングは関数をプリミティブとして使用するため、プロセスで評価されることなく、関数を変数に入れて引数として渡すことができます。

Haskellersは通常、純度要件に取り組みます。機能の純粋さは、機能に副作用(状態の変化を含む)があってはならないという考えです。つまり、同じ引数を使用して関数を呼び出すたびに、同じ値を返す必要があります。

2番目の関数は、必要な最初の条件で失敗します。あなたは第一級市民として機能を使用していません。

このように書くと、

func1(int a) {
  return (
    if (a==100)
      then func(0);
      else func2(a);
    )
}

これは現在純粋ですが、特に機能的でも、特に必須でもありません。

コンテキストが少なすぎるため、あなたの例を特に機能的なものに変換することはできません。関数型コードの通常の「HelloWorld」は次のとおりです。

square(x) = x * x
twice(f, x) = f(f(x))
twice(square, 4)
  => 256

ここではsquare、数値をそれ自体で乗算する関数を定義します。twice関数と引数を取り、その関数を引数に2回適用する別の関数を定義します。次に、関数twiceに引数squareとを与えます4。これはそうではないことに注意してくださいtwice(square(4))-関数squareは、関数の定義内になるまで評価されませんtwice

于 2012-03-03T02:38:39.920 に答える