我希望有一种方法可以在Scala中定义函数的类型。
例如,假设我想要一个需要两个Ints并返回一个布尔值的函数,我可以定义一个使用它的函数:
def checkInts(f: (Int,Int) => Boolean) = {
// do stuff
}
有没有办法定义f的类型?然后我可以做类似的事情:
def checkInts(f: MyFunctionType)
或
def checkInts(f: Option[MyFunctionType])
答案 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))
如果您想用一些逻辑来包装异步函数参数,例如,这可能非常方便。类似交易的操作。