在学习Scala时,我从这里得到了一个高阶函数的例子
https://docs.scala-lang.org/tour/higher-order-functions.html
def apply(f : Int => String, v : Int) = f(v)
def layout[A](x : A) : String = x.toString
println(apply(layout, 1000))
我的问题是布局是否包含多个参数,如下所示:
def layout[A](x : A, y : A) : String = x.toString + y.toString
对于直观的理解,我定义如下应用
def apply(f : Int, Int => String, v : Int, w : Int) = f(v, w)
当然,这是无法编译的。 我认为我偏离了对Scala中函数类型的理解。
如何用正确的姿势解决这个问题,并用正确的姿势解决这个问题,更深入地了解scala函数类型的定义是好的。
答案 0 :(得分:0)
只需在参数
周围放置一个括号def apply(f : (Int, Int) => String, v1 : Int, v2: Int) = f(v1, v2)
阅读scala中的函数特征,有22个函数特征(Function0,Function1,..... Function2),适用于您的情况: http://www.scala-lang.org/api/2.12.3/scala/Function2.html
还要了解Java8中的功能接口,然后尝试与Scala功能特性进行比较。
答案 1 :(得分:0)
让我帮你举个例子
package scalaLearning
object higherOrderFunctions {
def main(args: Array[String]): Unit = {
def add(a: Int , b:Int):Int =a+b //Function to add integers which two int values and return and int value
def mul(a:Int, b:Int ) :Float=a*b //Function which takes two int values and return float value
def sub(a:Int,b:Int):Int=a-b //function which takes two int values and return int value
def div(a:Int,b:Int):Float =a/b//Function which takes two int value and return float value
def operation(function:(Int,Int)=>AnyVal,firstParam:Int,secondParam:Int):AnyVal=function(firstParam,secondParam) //Higher order function
println(operation(add,2,4))
println(operation(mul,2,4))
println(operation(sub,2,4))
println(operation(div,2,4))
}
}
这里创建高阶函数,将输入作为函数,
首先,您需要了解参数的输入类型 拿走它返回的东西,
在我的情况下,它需要两个int值并返回float或int,所以你可以 提到函数_ :( Int,Int)=> AnyVal
并将参数传递给您指定的此函数 firstParam:Int(这也可以是firstParam:AnyVal)作为第一个参数并指定
secondParam:Int(这也可能是secondParam:AnyVal)用于第二个参数。
def operation(function(Int,Int)=>AnyVal,firstParam:Int,secondParam:Int):AnyVal=function(firstParam,secondParam) //Higher order function