在Scala中指定lambda返回类型

cor*_*zza 8 lambda types scala

注意:这是一个理论问题,我不是想解决任何问题,也不是为了实际目的而试图取得任何效果

使用(arguments)=>expression语法在Scala中创建lambda时,是否可以显式提供返回类型?

Lambda与方法没有区别,因为它们都被指定为表达式,但据我所知,方法的返回类型很容易用def name(arguments): return type = expression语法定义.

考虑这个(说明性)示例:

def sequence(start: Int, next: Int=>Int): ()=>Int = {
    var x: Int = start

    //How can I denote that this function should return an integer?    
    () => {
        var result: Int = x
        x = next(x)
        result
    }
}
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 16

您始终可以通过追加:和类型来声明表达式的类型.所以,例如:

((x: Int) => x.toString): (Int => String)
Run Code Online (Sandbox Code Playgroud)

例如,如果您有一个很复杂的表达式并且您不想依赖类型推断来直接获取类型,那么这很有用.

{
  if (foo(y)) x => Some(bar(x))
  else        x => None
}: (Int => Option[Bar])
// Without type ascription, need (x: Int)
Run Code Online (Sandbox Code Playgroud)

但是如果将结果分配给具有指定类型的临时变量,则可能更清楚:

val fn: Int => Option[Bar] = {
  if (foo(y)) x => Some(bar(x))
  else        _ => None
}
Run Code Online (Sandbox Code Playgroud)