在我的Scala course中给出了一个例子。它是关于寻找更通用的函数,可用于定义算术求和函数和算术生成函数。以下是应该概括的函数。
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函数可用于概括sum和product函数,如下所示:
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。我无法理解这种关系。任何帮助都会让我很开心。
此致
答案 0 :(得分:5)
函数式编程通常有三个中心运算符:map
,reduce
(有时称为fold
)和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
即可。
如果你对他名字的重要性感到好奇,你应该问他。他是你的导师和所有人。
答案 1 :(得分: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)
}
你看到了链接吗?
答案 2 :(得分:1)
mapReduce的映射函数在问题中是f,尽管它的定义并不是一个例子。对于sum和product,它将是identity函数,但如果你对正方形求和,则映射函数将是square函数。
mapReduce的reducer函数是combine,其中我们将累加器+值的元组减少到新的累加器以进行下一次递归。
我认为除了代码不清楚之外缺少的链接是将数字视为集合(例如,3是三个1的集合)。这是非常不寻常的,我不知道它会给你带来什么,但可能是你的老师会在数字和集合之间使用类比来获得更深刻的东西。
这是来自奥德斯基的课程吗?