Обнаружена ошибка компиляции Scala: требуется Int: Int => Int
Я новичок в скале. Я не понимаю ошибку компиляции для приведенного ниже кода:
def delayed( t:(Int)=> Int):Unit={
println("In delayed method")
var y=t;
println(y)
}
def time(x:Int):Int={
x*2
}
и когда я звоню
delayed(time(8))
Я получаю следующую ошибку:
scala> delayed(time(8))
<console>:15: error: type mismatch;
found : Int
required: Int => Int
delayed(time(8))
^
Пожалуйста, объясните, в чем проблема? Также, пожалуйста, предложите хорошую ссылку для понимания функций и функциональных литералов в Scala. Я не могу полностью понять.
Спасибо
Редактировать:
Пожалуйста, расскажите разницу между
def delayed( t: Int => Int):Unit = {
а также
def delayed(t: =>Int):Unit {
а также
def delayed(t:=>Int):Unit { (without space b/w ":" and "=>"))
2 ответа
Ваша функция delayed
ожидает, что функция в качестве аргумента, однако, вы передали Int
, Вот почему вы получаете ошибку.
Тип аргумента delayed
является Int=>Int
, что означает, что это функция, принимающая один Int
в качестве аргумента и возвращает Int
,
Ваша функция time
является Int=>Int
функция, однако, когда вы передаете time(8)
к delayed
функция, time(8)
будет оцениваться до его передачи delay
и результат оценки просто Int
,
scala> delayed(time(8))
<console>:14: error: type mismatch;
found : Int
required: Int => Int
delayed(time(8))
^
Если вы передадите time
только функция, это будет работать.
scala> delayed(time)
In delayed method
<function1>
Если вы хотите пройти time(8)
в качестве аргумента функции, вы должны изменить time
функция для возврата функции:
scala> def time(x:Int) = () => x*2
Вы также должны изменить delayed
функция как ниже:
def delayed(t:()=>Int) {
println("In delayed method")
var y=t();
println(y)
}
Тогда вы можете пройти time(8)
в delayed
,
scala> delayed(time(8))
In delayed method
16
Или вы можете использовать вызов по имени, как @Tzach, упомянутый в комментарии.
scala> def delayed(t: =>Int) {
| println("In delayed method")
| var y = t
| println(y)
| }
delayed: (t: => Int)Unit
scala> def time(t:Int) = t*2
time: (t: Int)Int
scala> delayed(time(8))
In delayed method
16
Метод delayed
ожидает функцию с входным параметром Int
и тип возврата Int
Но в вашем примере вы передаете результат time
функция.
Это решит вашу проблему.
delayed(time)