Coursera Scala 2-2:Curry函数

Curry函数,将一个函数的参数,拆分成多个。概念不好理解,还是用代码最好。如下:

乘积函数

有一个乘积函数,计算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)

你可能感兴趣的:(scala)