Указание типа возврата 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 }