在Scala中指定lambda返回类型

时间:2014-03-10 23:02:26

标签: scala types lambda

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

使用(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
    }
}

3 个答案:

答案 0 :(得分:16)

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

((x: Int) => x.toString): (Int => String)

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

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

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

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

答案 1 :(得分:3)

x => x:SomeType

我不知道答案,因为我从来没有这个需要,但我的直觉是,这会有效。并在工作表中尝试确认它。

编辑:我在上面有一个例子之前提供了这个答案。确实,具体例子中不需要这样做。但在极少数情况下,你需要它,我展示的语法将起作用。

答案 2 :(得分:1)

假设你有这个功能:

def mulF(a: Int, b: Int): Long = {
      a.toLong * b
}

可以将相同的函数写为具有已定义输入和输出类型的lambda:

val mulLambda: (Int, Int) => Long = (x: Int, y: Int) => { x.toLong * y }