Указание типа возврата lambda в Scala

Примечание: это теоретический вопрос, я ничего не пытаюсь исправить, и я не пытаюсь достичь какого-либо эффекта для практической цели

при создании лямбды в Scala с помощью (arguments)=>expression синтаксис, можно ли явно указать тип возврата?

лямбды не отличаются от методов тем, что они оба указаны как выражения, но, насколько я понимаю, возвращаемый тип методов легко определяется с помощью 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 ответов


вы всегда можете объявить тип выражения, добавив : и типа. Так, например:

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

x => x:SomeType

Edit: я предоставил этот ответ, прежде чем был приведен пример выше. Правда, в конкретном примере это не требуется. Но в редких случаях, когда вам это нужно, синтаксис, который я показал, будет работать.


Допустим у вас есть эта функция:

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

та же функция может быть записана как лямбда с определенными типами ввода и вывода:

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