部分函数作为Scala中的输入参数

时间:2018-10-22 14:16:50

标签: scala

我试图将部分函数作为输入传递给平方函数。    以下代码是什么?

package PartialFunction

object PartialFunctionSum {
  val yourConstant = 10

  val pf: PartialFunction[(Int, Int), Int] = {
    case (x, y) => x + y + yourConstant
  }
  def square(cb:(Int, Int) => Int): Unit = {
     println(cb(5,10))
  }

  def main(args: Array[String]): Unit= {
   square(pf)
  }  
}

3 个答案:

答案 0 :(得分:2)

PartialFunction是Function1(a => b),square需要Function2((a,b)=> c)

完成任务的一种方法是将cb的类型更改为Function1

object PartialFunctionSum extends App {

  val yourConstant = 10

  val pf: PartialFunction[(Int, Int), Int] = {
    case (x, y) => x + y + yourConstant
  }
  def square(cb:((Int, Int)) => Int): Unit = {
    println(cb(5,10))
  }

  square(pf)

}

此外,在需要FunctionX的任何地方,您都可以定义PartialFunction,因此

square {
  case (x, y) => x + y + yourConstant
}

或在带有lambda的Function2中转换PartialFunction

square( pf.apply(_, _) )

答案 1 :(得分:1)

任何需要函数的地方都可以传递PartialFunction,

您的问题是正方形定义:

def square(cb:(Int, Int) => Int): Unit = {
    println(cb(5,10))
}

这意味着cb是一个接收两个Int并返回另一个Int的函数。

只需更改方形签名如下:

def square(cb: ((Int, Int)) => Int): Unit = {
  println(cb(5 -> 10))
}

现在您的类型兼容,其余代码可以按预期工作。

答案 2 :(得分:0)

(Int, Int) => IntFunction2[Int, Int, Int](一个具有2个Int参数并返回一个Int的函数)的实例,而不是PartialFunction[(Int, Int), Int](一个接受类型为(Int, Int)的输入并返回一个Int

如果要以元组形式传递参数,则:

def square(cb:PartialFunction[(Int, Int),Int]): Unit = {
     println(cb((5,10)))
  }

示例:

def square(cb:PartialFunction[(Int, Int),Int]): Unit = {
     println(cb((5,10)))
  }

square: (cb: PartialFunction[(Int, Int),Int])Unit

scala> square{case (i, j) => i * j}
50