如何在Scala中定义函数的类型?

时间:2009-12-05 23:35:38

标签: scala function

我希望有一种方法可以在Scala中定义函数的类型。

例如,假设我想要一个需要两个Ints并返回一个布尔值的函数,我可以定义一个使用它的函数:

def checkInts(f: (Int,Int) => Boolean) = {
  // do stuff
}

有没有办法定义f的类型?然后我可以做类似的事情:

def checkInts(f: MyFunctionType)

def checkInts(f: Option[MyFunctionType])

2 个答案:

答案 0 :(得分:46)

trait Foo {
  type MyFunction = (Int,Int) => Boolean

  def checkInts(f: MyFunction)
  def checkInts(f: Option[MyFunction])
}

答案 1 :(得分:0)

增加原始答案:

对于一些更复杂的情况,您可以使用结构类型,其中也可以包含函数定义[1][2]

对于特定示例和实际用法,函数类型可以与Future很好地结合使用,例如传递ExecutionContext并在传递后实际执行异步功能。

但是请注意,如果执行类中始终有您的EC,因此不需要传递它,则可以使用按名称命名的参数(“仅提供Future结果”){ {3}}。

下面的示例草案显示了这个简单的想法:它具有仅带有ec的函数类型和结构类型,该结构类型还可以带有要执行的函数的一些参数。它还显示了一个带别名功能的替代方法:

/** Define types in companion and sample functions that use them as args. */
class Fun(implicit ec: ExecutionContext) {
  import Fun._

  def foo(fun: SimplyFun): Future[String] = fun()
  def bar(fun: StructuredFun): Future[String] = fun.buzz(fun.bee)
  def byNameBaz(fun: => Future[String]) = fun
}

object Fun {
  type SimplyFun = ExecutionContext => Future[String]
  type StructuredFun = {
    def buzz(bee: Int)(implicit ec: ExecutionContext): Future[String]
    val bee: Int
  }
}

// (somewhere outside)
// example args could be instantiated as follows:
val simpleArg: SimplyFun = _ => Future.successful(String)
val structuredArg: StructuredFun = new {
  def buzz(bee: Int)(implicit ec: ExecutionContext) = Future.successful(s"$bee")
  val bee = 3
}

// ...and passed for execution along with the EC you like:
import scala.concurrent.ExecutionContext.Implicits.global
new Fun().foo(simpleArg)
new Fun().bar(structuredArg)
new Fun().byNameBaz(Future.failure(new RuntimeException))

如果您想用一些逻辑来包装异步函数参数,例如,这可能非常方便。类似交易的操作。