从函数返回函数时的Scala错误解密



我试图在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

有相当多的语法错误,主要是

  • 类型构造函数使用方括号接受类型参数,因此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
}
}

最新更新