问一个Scala的语法问题!!!!!!

美伊小公主的奶爸 2015-04-16 05:45:00
看用Scalding写的MapReduce程序时,看到有这么个函数定义:
def flatMap[A, T](fs: (Fields, Fields))(fn: A => TraversableOnce[T])(implicit conv: TupleConverter[A], setter: TupleSetter[T]): Pipe = {
conv.assertArityMatches(fs._1)
setter.assertArityMatches(fs._2)
each(fs)(new FlatMapFunction[A, T](fn, _, conv, setter))
}

调用的时候是这样:
flatMap('line -> 'word){ lineA : String => tokenize(lineA) } //tokenize(是一个函数, 不用考虑)


我就不明白了:
函数定义的明明是3层括号,也就像是3层柯里化似的, 但是调用函数的时候, 为什么用一个()和一个{}就搞定了呢??
而且lineA : String => tokenize(lineA)这句是什么意思?! 如果是传入一个匿名函数作为参数,也应该是加小括号啊: (lineA : String) => tokenize(lineA)
...全文
432 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mooonchen 2015-08-03
  • 打赏
  • 举报
回复
'line -> 'word 传给了 fs: (Fields, Fields) lineA : String => tokenize(lineA) 传给了 (fn: A => TraversableOnce[T]) implicit conv: TupleConverter[A], setter: TupleSetter[T] 这个不用传,只要上下文中有implicit定义就行 在scala中如果调用函数只有一个参数,调用时可以使用{}来替代() 这里用了柯里化,(fn: A => TraversableOnce[T]) 小括号中只有一个参数,所以在调用时 可以使用{} 代替() 比如下面的例子
object Test {
  def f(a:Int) = {a}
  def main(args: Array[String]) {
    val a = f{15} // 这里用{}代替()
    println(a)
  }
}
FightForProgrammer 2015-07-28
  • 打赏
  • 举报
回复
不要以命令式编程语言(c/c++)来理解它,学习它,就要按照它的思考方式函数式 lineA : String => tokenize(lineA)意思是String类型的变量lineA,把他传入函数tokenize 人家这个语言就是这种写法,为啥一定要是命令式语言的写法 (lineA : String) => tokenize(lineA)
suicidedamsel 2015-06-03
  • 打赏
  • 举报
回复
第一个参数是pair 第二个参数是function,调用时{}用来代替具体的函数 第三个参数是implicit,上下文中有implicit的引用就可以省略这个参数
  • 打赏
  • 举报
回复
没人知道么 ?? 我加分了!!!!!!
qq_27483059 2015-04-17
  • 打赏
  • 举报
回复
我看不懂 小学生飘过
notepadsz 2015-04-17
  • 打赏
  • 举报
回复
没人回答么? 这里应该都是scala的高手啊
  • 打赏
  • 举报
回复
没人回答么? 这里应该都是scala的高手啊!

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧