Coursera Scale 2-2:Curry関数

4421 ワード

Curry関数は、1つの関数のパラメータを複数に分割します.概念がよく理解できないので、コードを使うのが一番いいです.次のようになります.
せきさんかんすう
1つの積関数があり、a~bが関数fに基づいて変換された値の積を計算する
def product(f:Int=>Int)(a:Int,b:Int): Int =
  if( a > b ) 1
  else f(a) * product(f)(a + 1, b)

これにより、次のように関数を多重化できます.
def factorial(n: Int) = product(x => x)(1, n)

その後、このcurry関数をfactorial関数として使用することに専念することができます.
factorial(3)
factorial: factorial[](val n: Int) => Int
res0: Int = 6

累加関数
a~bが関数fに基づいて変換された値の累積を計算する累積関数がある
def sum(f:Int=>Int)(a:Int,b:Int): Int =
  if( a > b ) 0
  else f(a) + sum(f)(a + 1, b)

cubeSumとして:
def cubSum(a:Int,b:Int) = sum(x => x*x)(a,b)

より一般的
combine:累積か乗算かを決める
def mapreduce(combine:(Int,Int)=>Int,zero: Int)(f:Int=>Int)(a:Int,b:Int): Int =
  if( a > b ) zero
  else combine(f(a) ,mapreduce(combine,zero)(f)(a + 1, b))

これまでの関数は次のように表すことができます.
def sum(a:Int,b:Int) = mapreduce((x,y) =>x+y,0)(x => x)(a,b)sum(1,3) def cubeSum(a:Int,b:Int) = mapreduce((x,y) =>x+y,0)(x => x * x)(a,b)sum(1,3) def product(a:Int,b:Int) = mapreduce((x,y) =>x*y,1)(x => x)(a,b) def factorial(n: Int) = mapreduce((x,y) =>x*y,1)(x => x)(1,n)