首页 > 解决方案 > 我应该如何为元组实现 scala 解释器?

问题描述

我正在实现 scala 解释器,但我遇到了一些问题。

首先,我想实现tuple

在我的Value.scala,跟随类存在:

case class TupleV(values: List[Type]) extends Value

此外,在我的Expr.scala, 跟随类中存在

case class TupleE(expressions: List[Type] extends Expr

TypeExpr.scala如下:

sealed trait Type
case object IntT extends Type
case object BooleanT extends Type
case object TupleT extends Type
case object ListT extends Type
case object FunctionT extends Type

所以,我实现如下:

case TupleE(values)=>TupleV(values)

但它说 List[Expr] found, List[Value] is required。我的代码有什么问题?我应该怎么做才能解决它?

我还尝试使用 ConsE 和 ConsV 类以不同的方式实现,这使我能够将列表分为头部和尾部:

case class ConsE(head: Expr, tail: Expr) extends Expr//in Expr.scala
case class ConsV(head: Value, tail: Value) extends Value//in Value.scala
case ConsE(head, tail)=>ConsV(interp(head), interp(tail)//my implementation for ConsV interpreter&works well now

使用它,我尝试了

case TupleE(expression)=>expression match{
  case ConsE(head, tail)=>ConsV(head, tail)
}

但它返回:ConsE 的“构造函数无法实例化为预期类型”错误。我应该如何解决它?

标签: scalainterpretertype-mismatch

解决方案


尝试更换

case class TupleV(values: List[Type]) extends Value

case class TupleE(expressions: List[Type]) extends Expr

case class TupleV(values: List[Value]) extends Value 

case class TupleE(expressions: List[Expr]) extends Expr

(这些定义是在练习中给您的,还是您自己可以修改的定义?)

基于

case TupleE(values)=>TupleV(values)

你在写解释器

def interpret(expr: Expr): Value

即继续您在如何在 scala 中实现“添加”解释器?

那么 , 的定义TupleV应该TupleE在上面。以前他们上面的定义对我来说意义不大。

Type类型检查时需要Expr

def typecheck(expr: Expr): Type // or Option[Type]

然后你会有更多的层次结构

case class TupleT(types: List[Type]) extends Type

所以,我实现如下:

case TupleE(values)=>TupleV(values)

但它说 List[Expr] found, List[Value] is required。我的代码有什么问题?我应该怎么做才能解决它?

这是不可复制的。代码编译

https://scastie.scala-lang.org/KWlyFOYDRHOgN6UibVY1pw

使用它,我尝试了

 case TupleE(expression)=>expression match{   
   case ConsE(head, tail)=>ConsV(head, tail)
 }

但它返回:ConsE 的“构造函数无法实例化为预期类型”错误。

这个错误很明显: in TupleE(expression) expressionhas type List[Type], it can't match ConsE,它只能匹配普通的 scala List


推荐阅读