【问题标题】:Deciphering Scala Errors When Returning Functions From Functions从函数返回函数时解读 Scala 错误
【发布时间】:2020-04-29 00:32:08
【问题描述】:

我正在尝试在 Scala 中构建一个基本的组合器解析器,并且在尝试用它编译最基本的解析器(字母“A”的解析器)时,我从 scalac 中得到三个我不明白的语法错误。我正在查看我的代码,但无法确定语法的哪些部分不正确,即使与在线示例进行比较也是如此。有人可以在这里解释一下我的 Scala 代码的哪些部分有问题吗?

代码:

import lexer
import scala.Option

object Main {
  def main(args: Array[String]) {
    val Lexer = new lexer.Lexer
    val tokens = Lexer.lex(args(0))
    val parseA = satsify(t => t.key == "A")
    println(parseA(tokens))
  }

  def satsify(predicate: Token => Bool): List(Token) => Option[(Token, List(Token))] = {
    tl: List(Token) => match tl { 
        case tl.isEmpty => None 
        case predicate(tl(0)) => Some(tl(0), tl.tail)
        case _ => None
    }
  }
}

错误:

combParser.scala:2: error: '.' expected but ';' found.
import scala.Option
^
combParser.scala:12: error: '=' expected but '(' found.
  def satsify(predicate: Token => Bool): List(Token) => Option[(Token, List(Token))] = {
                                             ^
combParser.scala:19: error: illegal start of simple expression
}
^
three errors found

【问题讨论】:

    标签: scala syntax


    【解决方案1】:

    语法错误比较多,主要是

    • 类型构造函数使用方括号接受类型参数,因此List[Token] 而不是List(Token)
    • 模式匹配中的守卫不能直接使用,因此case v if predicate(tl(0)) =>而不是case predicate(tl(0)) =>

    考虑到以上尝试

      def satsify(predicate: Token => Boolean): List[Token] => Option[(Token, List[Token])] = {
        (tl: List[Token]) => tl match {
          case Nil => None
          case head :: tail if predicate(head) => Some(head, tail)
          case _ => None
        }
      }
    

    【讨论】:

    • 谢谢,这解决了我的错误,并且似乎是一种更简洁的代码编写方式。你能解释一下模式匹配中的第二种情况是如何工作的吗?如何直接创建这些头尾变量并让它们对应于列表的正确部分?此外,由 scalac 给出的第一个错误仍然存​​在。你知道是什么原因造成的吗?谢谢。
    • Scala 有 分号推断,它允许您省略分号,编译器会为您推断它们。在这种情况下,它在两个import 语句之间推断出一个分号,即编译器看到的是import lexer; import scala.Optionimport 语句的语法是 import <path where to find the import>.<what to import>。您缺少“要导入的内容”位,因此 Scala 期待 . 而是找到它自己插入的 ;。另请注意,每个 Scala 程序中都有一个隐含的 import scala._,因此您的第二个 import 不会做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-04-26
    相关资源
    最近更新 更多