问题描述
看用Scalding写的MapReduce程序时,看到有这么个函数定义:defflatMap[A,T](fs:(Fields,Fields))(fn:A=>TraversableOnce[T])(implicitconv:TupleConverter[A],setter:TupleSetter[T]):Pipe={conv.assertArityMatches(fs._1)setter.assertArityMatches(fs._2)each(fs)(newFlatMapFunction[A,T](fn,_,conv,setter))}调用的时候是这样:flatMap('line->'word){lineA:String=>tokenize(lineA)}//tokenize(是一个函数,不用考虑)我就不明白了:函数定义的明明是3层括号,也就像是3层柯里化似的,但是调用函数的时候,为什么用一个()和一个{}就搞定了呢??而且lineA:String=>tokenize(lineA)这句是什么意思?!如果是传入一个匿名函数作为参数,也应该是加小括号啊:(lineA:String)=>tokenize(lineA)
解决方案
本帖最后由 cymvp 于 2015-04-16 23:27:10 编辑
解决方案二:
没人回答么?这里应该都是scala的高手啊!
解决方案三:
没人知道么??我加分了!!!!!!
解决方案四:
解决方案五:
解决方案六:
没人回答么?这里应该都是scala的高手啊
解决方案七:
我看不懂小学生飘过
解决方案八:
第一个参数是pair第二个参数是function,调用时{}用来代替具体的函数第三个参数是implicit,上下文中有implicit的引用就可以省略这个参数
解决方案九:
不要以命令式编程语言(c/c++)来理解它,学习它,就要按照它的思考方式函数式lineA:String=>tokenize(lineA)意思是String类型的变量lineA,把他传入函数tokenize人家这个语言就是这种写法,为啥一定要是命令式语言的写法(lineA:String)=>tokenize(lineA)
解决方案十:
'line->'word传给了fs:(Fields,Fields)lineA:String=>tokenize(lineA)传给了(fn:A=>TraversableOnce[T])implicitconv:TupleConverter[A],setter:TupleSetter[T]这个不用传,只要上下文中有implicit定义就行在scala中如果调用函数只有一个参数,调用时可以使用{}来替代()这里用了柯里化,(fn:A=>TraversableOnce[T])小括号中只有一个参数,所以在调用时可以使用{}代替()比如下面的例子objectTest{deff(a:Int)={a}defmain(args:Array[String]){vala=f{15}//这里用{}代替()println(a)}}