Scala的柯里化有的人也叫它半函数它的应用场景就是让一个方法的不同参数能够有更加高的可维护性写法柯里化自身在简单的场景下没有必要使用因为它就是多几个括号packagecom.wyobjectCurryFunction{defmain(args:Array[String]):Unit{println(add(2,3))println(addCurried(2)(3))//注意柯里化之后参数要分开写}//柯里化之前defadd(x:Int,y:Int){xy}//柯里化之后defaddCurried(x:Int)(y:Int){xy}// 1. 我只传第一个参数 a 10valaddTenaddCurried(10)_// 注意这里的 _ 是告诉编译器“我要把函数作为对象赋值给变量”所以第二参数目前先缺省// 此时addTen 的类型是Int Int// 它是一个“等待接收第二个参数”的新函数// 它内部已经记住了 a 10// 2. 我调用这个新函数传入 b 5valresult2addTen(5)// 结果: 15 (因为内部是 10 5)// 3. 我还可以再用这个新函数传入 b 100valresult3addTen(100)// 结果: 110 (因为内部是 10 100)}但如果你看过sparksql源码就会发现一种用柯里化实现高阶函数多态的写法protecteddefparse[T](command:String)(toResult:SqlBaseParserT):T{logDebug(sParsing command:$command)vallexernewSqlBaseLexer(newUpperCaseCharStream(CharStreams.fromString(command)))lexer.removeErrorListeners()lexer.addErrorListener(ParseErrorListener)valtokenStreamnewCommonTokenStream(lexer)valparsernewSqlBaseParser(tokenStream)parser.addParseListener(PostProcessor)parser.addParseListener(UnclosedCommentProcessor(command,tokenStream))parser.removeErrorListeners()parser.addErrorListener(ParseErrorListener)parser.legacy_setops_precedence_enabledconf.setOpsPrecedenceEnforced parser.legacy_exponent_literal_as_decimal_enabledconf.exponentLiteralAsDecimalEnabled parser.SQL_standard_keyword_behaviorconf.ansiEnabledtry{try{// first, try parsing with potentially faster SLL modeparser.getInterpreter.setPredictionMode(PredictionMode.SLL)toResult(parser)}catch{casee:ParseCancellationException// if we fail, parse with LL modetokenStream.seek(0)// rewind input streamparser.reset()// Try Again.parser.getInterpreter.setPredictionMode(PredictionMode.LL)toResult(parser)}}catch{casee:ParseExceptionife.command.isDefinedthrowecasee:ParseExceptionthrowe.withCommand(command)casee:AnalysisExceptionvalpositionOrigin(e.line,e.startPosition)thrownewParseException(Option(command),e.message,position,position,e.errorClass,e.messageParameters)}}/** Creates/Resolves DataType for a given SQL string. */overridedefparseDataType(sqlText:String):DataTypeparse(sqlText){parserastBuilder.visitSingleDataType(parser.singleDataType())}/** Creates Expression for a given SQL string. */overridedefparseExpression(sqlText:String):Expressionparse(sqlText){parserastBuilder.visitSingleExpression(parser.singleExpression())}还有就是柯里化可以配合参数式隐式转换达到参数默认值的效果》Scala隐式转换