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

问题描述 投票:0回答:1

我正在尝试在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个回答
0
投票

主要有很多语法错误

  • 类型构造函数使用方括号作为类型参数,因此是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
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.