Scala高阶函数混淆

时间:2017-09-22 10:32:39

标签: scala higher-order-functions

在学习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函数类型的定义是好的。

2 个答案:

答案 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