Function 3.scala中从函数返回函数的方法-1不';t编译-don';我不明白为什么

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 =

我在学Scala。我有一个Scala函数,它可以返回另一个函数。我在Scala中遇到了3种方法(可能还有更多)。在这段特定的代码中,第三个选项似乎没有编译,但我在其他地方看到过这种技术,但无法解释为什么它在这种情况下不起作用

在这个精心设计的示例中,我有一个函数,它接受Int并返回一个将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(更简单、更简洁)的转换。它不是有效地返回一个函数,因为你可以将它作为一个部分应用的函数使用吗