【问题标题】:3? ways in scala to return a function from a function - 1 doesn't compile - don't understand why3? scala中从函数返回函数的方法 - 1 无法编译 - 不明白为什么
【发布时间】:2015-03-27 06:09:02
【问题描述】:

我正在学习 Scala。我有一个可以返回另一个函数的 Scala 函数。我在 Scala 中遇到了 3 种方法(可能还有更多)。在这个特定的代码中,第 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) 在对象 FunSets 中缺少方法 intMapper3 的参数; 如果您想将其视为部分应用的函数,请使用 `_' 遵循此方法 val m3 = intMapper3(6) ^

【问题讨论】:

    标签: function scala


    【解决方案1】:

    def intMapper3(elem: Int)(x: Int) = x == elem 方法有两个参数列表,您只传递一个参数(即 elem),这里缺少第二个参数 (x)。而intMapper3 不是higher order function。它不将任何函数作为参数,也不返回函数。这是一个普通的方法,接受两个参数列表并返回一个布尔值。

    您可以从 m3 派生一个部分应用的函数作为val m3 = intMapper3(6)_。这就是编译器告诉你的。

    【讨论】:

    • 啊,好吧,所以通过将 _ 添加到第一个调用中,我可以使它的行为与 intMapper1/2 有效地相同。确定我试过了,但猜不到。出于兴趣,为什么说 intMapper3 不是高阶函数?我遵循的示例是在 Coursera 课程中描述的高阶函数和柯里化,它展示了从 intMapper1 到 intMapper2(使用匿名函数更简单)到 intMapper3(更简单、更简洁)的转换。它不是有效地返回一个函数,因为您可以将它用作部分应用的函数吗?
    【解决方案2】:

    您的方法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 类型的参数并返回一个布尔结果。

    scala> val m1 = intMapper1(2)
    m1: Int => Boolean = <function1>    
    scala> m1(2)
    res1: Boolean = true
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2011-12-08
      • 2023-01-27
      • 1970-01-01
      • 2021-10-20
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多