Scala编译错误 - 找到:Int required:Int =>诠释

时间:2016-10-19 07:35:17

标签: scala function literals function-literal

我是scala的新手。我不理解以下代码的编译错误:

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 个答案:

答案 0 :(得分:2)

您的函数delayed期望函数作为参数,但是,您通过了Int。这就是你得到错误的原因。

delayed的参数类型为Int=>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

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

或者您可以使用按名称调用作为评论中提到的@Tzach。

linecount = 10
with open('1.csv', 'r') as f, open('out.csv', 'w') as o:        
    while linecount > 0:
        o.write(f.readline())
        linecount -= 1

答案 1 :(得分:1)

方法Id需要一个包含输入参数delayed且返回类型为Int的函数 但是在您的示例中,您传递的是Int函数的结果。

这将解决您的问题。

time