2012-10-08 36 views
3

在我的Scala course中給出了一個例子。這是關於找到一個更廣義的函數,它可以用來定義一個算術求和函數和一個算術生成函數。以下是應該推廣的功能。很難理解爲什麼這個函數被稱爲MapReduce

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

這絕不是一個確切的解釋(名稱是模糊反正),但這裏是另一種定義:

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) 
} 

你看到的鏈接?

+0

非常感謝。 – cgon

5

函數編程通常有三個中央運算符:mapreduce(有時稱爲fold),和filter

  • Map將獲取一個列表和一個操作,並生成一個列表,其中包含應用於第一個列表中所有內容的操作。
  • Filter將獲取一個列表和一個測試,併產生另一個只包含通過測試的元素的列表。
  • Reduce(或fold)獲取列表,操作和初始值,並將操作應用於初始值和列表中的元素,將輸出與下一個列表項一起傳遞到自身,從而生成操作總和的名單。

如果,例如,列表是[2,3,4,5,6,7],初始值是1,並且您的操作是添加,減少將表現在下面的方式:

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

你的老師可能會叫它mapReduce,因爲這是範例的名字,儘管簡單的reduce也足夠了。

如果你對他的名字的重要性感到好奇,你應該問他。他是你的老師和所有人。

+0

這個例子來自在線視頻課程。很難問教練。 –

+0

我不知道,因爲你不是OP,所以我也不確定你是否也是。 – Wug

+2

@AntonSizikov如果你在談論Coursera課程,我已經看到馬丁(講師)有時在論壇 –

1

mapReduce的映射函數在問題中是f,儘管從來沒有其定義的例子。對於總和和產品它將是身份函數,但是如果您正在求和平方,那麼映射函數將是平方函數。

mapReduce的reducer函數是組合的,其中我們正在將累加器+值的元組減少到下一個遞歸的新累加器。

我認爲除了代碼不太清楚之外,缺少的鏈接是將數字視爲集合(例如,3是三個1的集合)。這很不尋常,我不知道它會給你帶來什麼,但可能是因爲你的老師以後會用數字和集合之間的比喻來表達更深刻的東西。

這是來自Odersky的課程嗎?

+0

是的,它來自Odersky的課程 – cgon