Обнаружена ошибка компиляции 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)
Другие вопросы по тегам