Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 很难理解为什么这个函数被称为MapReduce_Scala_Map_Reduce - Fatal编程技术网

Scala 很难理解为什么这个函数被称为MapReduce

Scala 很难理解为什么这个函数被称为MapReduce,scala,map,reduce,Scala,Map,Reduce,我举了一个例子。它是关于找到一个更广义的函数,可以用来定义算术求和函数和算术生产函数。以下是应该推广的函数 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 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。我不能理解这种关系。任何帮助都会使我非常高兴


函数式编程通常有三个中心操作符:
map
reduce
(有时称为
fold
)和
filter

  • Map接受一个列表和一个操作,并生成一个列表,其中包含应用于第一个列表中所有内容的操作
  • 过滤器接受一个列表和一个测试,并生成另一个仅包含通过测试的元素的列表
  • 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
也就足够了


如果你对他的名字的意义感到好奇,你应该问问他。他是你的指导老师,也是你的全部。

mapReduce的映射函数在这个问题上是f,尽管它的定义从来没有一个例子。对于和和和积,它将是恒等函数,但是如果你对平方求和,那么映射函数将是平方函数

mapReduce的reducer函数是combine,其中我们将acculator+value的元组减少为下一个递归的新累加器

我认为除了代码不太清楚之外,缺少的一个环节是将数字视为集合(例如,3是三个1的集合)。这是非常不寻常的,我不知道它给你带来了什么,但可能是你的老师在以后会用数字和集合之间的类比来做一些更深刻的事情


这是来自奥德斯基的coursera课程吗?

这绝不是一个确切的解释(名称无论如何都是模糊的),但这里有一个替代定义:

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

看到链接了吗?

示例来自在线视频课程。“很难问讲师。我不知道,既然你不是OP,我也不确定你是否会这样做。”安东西科夫如果你谈论Coursera课程,我看到Martin(讲师)有时会回答问题forum@Wug,课程是指coursera,我可以在论坛上问它,然而,我有一个强有力的证据表明coursera scala社区是SO scala社区的子集:))我在这里问这个问题效率更高。感谢所有回答这个问题的人。Regards@cgon:显示我所知道的。你能链接到问题中的课程吗?