1

我是斯卡拉的新手。我不明白以下代码的编译错误:

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 "=>"))
4

2 回答 2

2

您的函数delayed需要 function 作为参数,但是,您传递了Int. 这就是你得到错误的原因。

的参数的类型delayedInt=>Int,这意味着它是一个函数,接受一个Int作为参数并返回Int

您的函数timeInt=>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
于 2016-10-19T07:40:22.137 回答
1

方法delayed需要一个具有输入参数Int和返回类型的函数Int 但在您的示例中,您传递的是time函数的结果。

这将解决您的问题。

delayed(time)
于 2016-10-19T07:53:19.627 回答