【问题标题】:Required return keyword必需的返回关键字
【发布时间】:2015-08-25 19:45:30
【问题描述】:

所以我对 Scala 比较陌生,并且在 Scala 中进行函数式编程,并且在其中一个实践问题中遇到了一些新问题。在 hasSequences 中,我需要将 return 关键字放在我的返回值前面,否则什么都不会返回,下一行将执行。为什么需要这个?

def hasSubsequence[A](list: List[A], subList: List[A]) : Boolean = {
    def matcher(l: List[A], sl: List[A]): List[A] = {
      if (sl.isEmpty) return Nil

      l match {
        case Nil => Nil
        case head :: tail if (head == sl.head) => head :: matcher(tail, sl.tail)
        case head :: tail => matcher(tail, sl)
        case _ => Nil
      }
    }
    if (matcher(list, subList) == subList) true else false
  }

【问题讨论】:

    标签: scala functional-programming return pattern-matching


    【解决方案1】:

    这是必需的,因为 Scala 将返回值视为函数中的最后一个值,或 return 关键字后面的值。由于您的示例不是函数中的最后一件事,Scala 怎么知道您想要返回它?想象这样一种情况,您使用具有副作用的函数,该函数也有返回值。如果您在没有将结果分配给任何东西的情况下调用该函数,那么在没有这些限制的情况下,您将无法确定是否要返回该值。

    你可以像这样修改你的函数:

    def hasSubsequence[A](list: List[A], subList: List[A]) : Boolean = {
      def matcher(l: List[A], sl: List[A]): List[A] = {
        if (sl.isEmpty) Nil
        else l match {
          case Nil => Nil
          case head :: tail if (head == sl.head) => head :: matcher(tail, sl.tail)
          case head :: tail => matcher(tail, sl)
          case _ => Nil
        }
      }
      if (matcher(list, subList) == subList) true else false
    }
    

    避免退货。由于这使得match 成为与return 相同的if 语句的一部分,因此它们都成为最新语句的一部分,您不再需要显式地return

    【讨论】:

    • @DaveM 这通常是你用像 Haskell 这样强制纯度的函数式语言编写它的方式。 if (empty) return Nil; something_else 风格在技术上是一个命令式程序,因为它依赖于按顺序执行的一系列步骤。这并没有使它;像这样编写“本地命令”的代码是正常的 Scala 习惯用法。但是在通过给出结果表达式(而不是产生结果的“配方”)来更严格地定义函数的语言中,“if with no else”风格是不可能的。
    • (这意味着 Haskell 不需要 return 关键字,通过将名称 return 赋予标准库中几乎但不完全是完全不同于其他语言的 return 关键字)。
    猜你喜欢
    • 2015-06-06
    • 2018-10-18
    • 1970-01-01
    • 2018-07-26
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多