【问题标题】:Template types not working in Scala?模板类型在 Scala 中不起作用?
【发布时间】:2013-09-11 05:54:10
【问题描述】:

Here are the errors 在此列表 [3.5] 上运行 sbt run 时收到来自 [1]

import util.parsing.combinator.JavaTokenParsers

trait ArithParser extends JavaTokenParsers {
    type T
    def expr: Parser[T] = chainl1(term,   "+" ^^^ Add |  "-" ^^^ Sub)
    def term            = chainl1(factor, "*" ^^^ Mul |  "/" ^^^ Div)
    def factor          = floatingPointNumber  ^^ Num | "(" ~> expr <~ ")"

    def Add = (T,T)  => T
    def Sub = (T,T)  => T
    def Mul = (T,T)  => T
    def Div = (T,T)  => T
    def Num = String => T
}

trait DirectEvaluation {
    type T = Double
    val Add = (_: Double) + (_:Double)
    val Sub = (_: Double) - (_:Double)
    val Mul = (_: Double) * (_:Double)
    val Div = (_: Double) / (_:Double)
    val Num = (_: String).toDouble
}

trait ASTBuilding {
    type T = Expr
    sealed abstract class Expr

    case class Add(e1: Expr, e2: Expr) extends Expr
    case class Sub(e1: Expr, e2: Expr) extends Expr
    case class Mul(e1: Expr, e2: Expr) extends Expr
    case class Div(e1: Expr, e2: Expr) extends Expr
    case class Num(e: String) extends Expr
}

object Interpreter extends ArithParser with DirectEvaluation
object Compiler extends ArithParser with ASTBuilding

object Main extends ArithParser {
    def main(args: Array[String]) {
        val defArgs = if (args.isEmpty) Array("10.5 - 4*2") else args
        val parser: ArithParser = if(defArgs.head === "eval") {
                println("Interpreter!"); Interpreter
            } else {
                println("Compiler!"); Compiler
            }
        defArgs.tail foreach {arg =>
            println("Input: " + arg)
            println("Output: " + parseAll(parser.expr, arg))
        }
    }
}

[1]E. Labun, “Combinator Parsing in Scala,” Technische Hochschule Mittelhessen, 2012.

如何修复这些错误?

【问题讨论】:

    标签: scala templates types sbt scala-2.10


    【解决方案1】:

    (T,T) =&gt; T 是一个类型注解,因此您必须将= 替换为:

    def Add: (T,T) => T
    

    这也正是你所指的论文中的内容。

    列表中也不存在===,它只是一个==

    你必须在解析器上调用parseAll

    parser.parseAll(...)
    

    在我看来,您缺少 scala 编程的基础知识,否则您可以自己轻松修复这些错误。我的建议是,在开始学习高级主题之前,请阅读一本好的 scala 书籍以对语言有一个基本的了解。

    【讨论】:

    • 诚然,我确实尝试在调试的某个时间点直接复制和粘贴代码,但这并没有解决问题。无论如何,你指出的都是愚蠢的错误,猜测3天不睡觉会增加这种>.
    猜你喜欢
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2017-11-04
    • 2021-01-18
    相关资源
    最近更新 更多