3

私のScalaコースでは、例が与えられました。それは、算術合計関数と算術生成関数を定義するために使用できる、より一般化された関数を見つけることでした。一般化する必要がある機能は次のとおりです。

def sum(f:Int=>Int)(a:Int,b:Int):Int ={
 if(a>b) 0
 else f(a) + sum(f)(a+1,b)
}

def product(f:Int=>Int)(a:Int,b:Int):Int={
 if(a>b)1
 else f(a)*product(f)(a+1,b)
}

これらの機能を一般化するために、教師は次のような機能を与えました。

def mapReduce(f:Int=>Int,combine: (Int,Int)=>Int, zero:Int)(a:Int,b:Int):Int ={
    if(a>b) zero
    else combine(f(a),mapReduce(f, combine, zero)(a+1, b))
}

したがって、mapReduce 関数を使用して、次のように合計関数と積関数を一般化できます。

def sumGN(f:Int=>Int)(a:Int,b:Int) = mapReduce(f, (x,y)=>(x+y), 0)(a, b)
def productGN(f:Int=>Int)(a:Int,b:Int) = mapReduce(f, (x,y)=>(x*y), 1)(a, b)

関数型プログラミングの map reduce の定義を見てみましたが、一般化された関数が上記の map reduce と名付けられた理由がわかりません。関係が掴めない。どんな助けでも私はとても幸せになります。

よろしく

4

3 に答える 3

5

map関数型プログラミングには通常、 、reduce( と呼ばれることもあるfold) 、およびの3 つの中心的な演算子がありfilterます。

  • Map はリストと操作を受け取り、最初のリストのすべてに適用される操作を含むリストを生成します。
  • Filter はリストとテストを受け取り、テストに合格した要素のみを含む別のリストを生成します。
  • リデュース (またはフォールド) は、リスト、操作、および初期値を取り、その操作を初期値とリスト内の要素に適用し、出力を次のリスト項目と共にそれ自体に渡し、リストの演算合計を生成します。 .

たとえば、リストが [2,3,4,5,6,7] で、初期値が 1 で、演算が加算の場合、リダクションは次のように動作します。

Reduce([2,3,4,5,6,7], +, 1) = ((((((initial + 2) + 3) + 4) + 5) + 6) + 7)

mapReduceこれはパラダイムの名前であるため、インストラクターはそれを呼んでいる可能性がありますが、単純reduceにそれで十分です.

彼の名前の意味について知りたい場合は、彼に尋ねてみてください。彼はあなたのインストラクターであり、すべてです。

于 2012-10-08T14:05:21.780 に答える
4

これは決して正確な説明ではありませんが (とにかく名前があいまいです)、別の定義を次に示します。

def mapReduce(f: Int => Int, combine: (Int, Int) => Int, zero: Int)(a: Int, b: Int): Int ={
  if (a > b) zero
  else (a to b).map(f).reduce(combine)
}

リンクが表示されますか?

于 2012-10-08T14:23:25.053 に答える
1

mapReduce のマッピング関数は質問の f ですが、その定義の例はありません。合計と積の場合は恒等関数になりますが、2 乗を合計する場合、マッピング関数は 2 乗関数になります。

mapReduce のレデューサー関数は結合であり、次の再帰のためにアキュムレータ + 値のタプルを新しいアキュムレータに減らします。

コードがあまり明確でないことに加えて、欠落しているリンクは、数値をコレクションとして扱うことだと思います (たとえば、3 は 3 つの 1 のコレクションです)。これは非常に珍しいことであり、それがあなたに何をもたらすかはわかりませんが、先生は数字とコレクションの類推を後でより深い何かのために使用する可能性があります.

これはオデルスキーのコーセラコースからですか?

于 2012-10-08T14:16:02.760 に答える