Function 3.scala中从函数返回函数的方法-1不';t编译-don';我不明白为什么
我在学Scala。我有一个Scala函数,它可以返回另一个函数。我在Scala中遇到了3种方法(可能还有更多)。在这段特定的代码中,第三个选项似乎没有编译,但我在其他地方看到过这种技术,但无法解释为什么它在这种情况下不起作用 在这个精心设计的示例中,我有一个函数,它接受Int并返回一个将Int映射为Boolean的函数Function 3.scala中从函数返回函数的方法-1不';t编译-don';我不明白为什么,function,scala,Function,Scala,我在学Scala。我有一个Scala函数,它可以返回另一个函数。我在Scala中遇到了3种方法(可能还有更多)。在这段特定的代码中,第三个选项似乎没有编译,但我在其他地方看到过这种技术,但无法解释为什么它在这种情况下不起作用 在这个精心设计的示例中,我有一个函数,它接受Int并返回一个将Int映射为Boolean的函数 def intMapper1(elem: Int): Int => Boolean = { def mapper(x: Int): Boolean =
def intMapper1(elem: Int): Int => Boolean = {
def mapper(x: Int): Boolean =
x == elem
mapper
}
def intMapper2(elem: Int): Int => Boolean = (x: Int) => x == elem
def intMapper3(elem: Int)(x: Int) = x == elem
val m1 = intMapper1(2)
val m2 = intMapper2(4)
val m3 = intMapper3(6)
我得到编译错误:
错误:(35,22)在对象函数集中缺少方法intMapper3的参数;
如果要将其视为部分应用的函数,请使用“\u1”遵循此方法
val m3=intMapper3(6)
^方法
def intMapper3(elem:Int)(x:Int)=x==elem
有两个参数列表,您只传递一个参数(即elem),这里缺少第二个参数(x)。而intMapper3
不是高阶函数
。它不接受任何函数作为参数,也不返回函数。这是一个普通方法,采用两个参数列表并返回一个布尔值
您可以从m3派生一个部分应用的函数,如
val m3=intMapper3(6)\uu
。这就是编译器告诉您的。方法def intMapper3(elem:Int)(x:Int)=x==elem
有两个参数列表,您只传递一个参数(即elem),这里缺少第二个参数(x)。而intMapper3
不是高阶函数
。它不接受任何函数作为参数,也不返回函数。这是一个普通方法,采用两个参数列表并返回一个布尔值
您可以从m3派生一个部分应用的函数,如
val m3=intMapper3(6)\uu
。这就是编译器告诉您的。方法def intMapper3(elem:Int)(x:Int)=x==elem
有两个参数列表,您只传递一个参数(即elem),这里缺少第二个参数(x)。而intMapper3
不是高阶函数
。它不接受任何函数作为参数,也不返回函数。这是一个普通方法,采用两个参数列表并返回一个布尔值
您可以从m3派生一个部分应用的函数,如
val m3=intMapper3(6)\uu
。这就是编译器告诉您的。方法def intMapper3(elem:Int)(x:Int)=x==elem
有两个参数列表,您只传递一个参数(即elem),这里缺少第二个参数(x)。而intMapper3
不是高阶函数
。它不接受任何函数作为参数,也不返回函数。这是一个普通方法,采用两个参数列表并返回一个布尔值
您可以从m3派生一个部分应用的函数,如
val m3=intMapper3(6)\uu
。这就是编译器告诉您的。您的方法def intMapper3(elem:Int)(x:Int)=x==elem
是scala中的一个简单函数。它接受两个参数“elem”和“x”,并计算结果
它可以用作:
scala> intMapper3(2)(2)
res2: Boolean = true
scala> intMapper3(2)(1)
res3: Boolean = false
但如果只传递一个参数,它将显示错误,因为intMapper3需要两个参数
“intMapper1”函数可以通过以下方式调用:
scala> intMapper1(1)(2)
res0: Boolean = false
scala> intMapper1(1)(1)
res1: Boolean = true
在本例中,“intMapper1”的输出是一个函数,它接受Int类型的and参数并返回布尔结果
scala> val m1 = intMapper1(2)
m1: Int => Boolean = <function1>
scala> m1(2)
res1: Boolean = true
scala>val m1=intMapper1(2)
m1:Int=>Boolean=
scala>m1(2)
res1:Boolean=true
您的方法def intMapper3(elem:Int)(x:Int)=x==elem
是scala中的一个简单函数。它接受两个参数“elem”和“x”,并计算结果
它可以用作:
scala> intMapper3(2)(2)
res2: Boolean = true
scala> intMapper3(2)(1)
res3: Boolean = false
但如果只传递一个参数,它将显示错误,因为intMapper3需要两个参数
“intMapper1”函数可以通过以下方式调用:
scala> intMapper1(1)(2)
res0: Boolean = false
scala> intMapper1(1)(1)
res1: Boolean = true
在本例中,“intMapper1”的输出是一个函数,它接受Int类型的and参数并返回布尔结果
scala> val m1 = intMapper1(2)
m1: Int => Boolean = <function1>
scala> m1(2)
res1: Boolean = true
scala>val m1=intMapper1(2)
m1:Int=>Boolean=
scala>m1(2)
res1:Boolean=true
您的方法def intMapper3(elem:Int)(x:Int)=x==elem
是scala中的一个简单函数。它接受两个参数“elem”和“x”,并计算结果
它可以用作:
scala> intMapper3(2)(2)
res2: Boolean = true
scala> intMapper3(2)(1)
res3: Boolean = false
但如果只传递一个参数,它将显示错误,因为intMapper3需要两个参数
“intMapper1”函数可以通过以下方式调用:
scala> intMapper1(1)(2)
res0: Boolean = false
scala> intMapper1(1)(1)
res1: Boolean = true
在本例中,“intMapper1”的输出是一个函数,它接受Int类型的and参数并返回布尔结果
scala> val m1 = intMapper1(2)
m1: Int => Boolean = <function1>
scala> m1(2)
res1: Boolean = true
scala>val m1=intMapper1(2)
m1:Int=>Boolean=
scala>m1(2)
res1:Boolean=true
您的方法def intMapper3(elem:Int)(x:Int)=x==elem
是scala中的一个简单函数。它接受两个参数“elem”和“x”,并计算结果
它可以用作:
scala> intMapper3(2)(2)
res2: Boolean = true
scala> intMapper3(2)(1)
res3: Boolean = false
但如果只传递一个参数,它将显示错误,因为intMapper3需要两个参数
“intMapper1”函数可以通过以下方式调用:
scala> intMapper1(1)(2)
res0: Boolean = false
scala> intMapper1(1)(1)
res1: Boolean = true
在本例中,“intMapper1”的输出是一个函数,它接受Int类型的and参数并返回布尔结果
scala> val m1 = intMapper1(2)
m1: Int => Boolean = <function1>
scala> m1(2)
res1: Boolean = true
scala>val m1=intMapper1(2)
m1:Int=>Boolean=
scala>m1(2)
res1:Boolean=true
Ah好的,通过在第一个调用中添加u,我可以使它的行为与intMapper1/2一样有效。我肯定我试过了,但我猜不会。出于兴趣,你为什么说intMapper3不是高阶函数?我所遵循的例子是在一个Coursera课程中,描述了高阶函数和currying,它展示了从intMapper1到intMapper2(使用匿名函数更简单)到intMapper3(更简单、更简洁)的转换。它不是有效地返回一个函数,因为你可以将它作为一个部分应用的函数使用吗