閱讀812 返回首頁    go 微軟 go windows


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)

最後更新:2017-04-03 12:56:38

  上一篇:go 設計模式六大原則---依賴倒置原則(DIP)
  下一篇:go 微信之父張小龍:怎樣做簡單的產品經理?六