【问题标题】:How should I implement scala interpreter for tuple?我应该如何为元组实现 scala 解释器?
【发布时间】:2020-09-28 23:42:20
【问题描述】:

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

首先,我想实现tuple

在我的Value.scala 中,存在跟班:

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

另外,在我的Expr.scala 中,存在跟班

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

Type 也在Expr.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] 是必​​需的。我的代码有什么问题?我应该怎么解决?

我还尝试使用 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 的“构造函数无法实例化为预期类型”错误。我该如何解决?

【问题讨论】:

  • 什么是TypeHow to create a Minimal, Reproducible Example不应该是TupleV(values: List[Value]) extends ValueTupleE(values: List[Expr]) extends Expr吗?
  • 请提供显示错误的真实代码,而不是带有语法错误的sn-ps。至少您需要显示包含 case 语句的 match
  • 不确定这是否仍然相关,但我在您的deleted 问题sealed trait Type case object IntT extends Type 中找到了Type 的定义...
  • 这个问题的类型相同。正如有人告诉我只关注一个问题,我改变了问题的格式。我还编辑了我的问题。

标签: scala interpreter type-mismatch


【解决方案1】:

尝试替换

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

即继续你在How should I implement "add" interpreter in scala?开始的内容

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

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] 是必​​需的。是什么 我的代码中的问题?我应该怎么解决?

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

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

我试过了

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

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

这个错误很明显:在TupleE(expression)expression有类型List[Type],它不能匹配ConsE,它只能匹配普通的scalaList

【讨论】:

  • 感谢您的回答。但是,案例类 TupleV 和 TupleE 的定义是为练习而提供的,我无法更改。
  • 在这个练习中,它包含 ConsE 函数,它允许我将列表分为头和尾,写成 case ConsE(head, tail)=>ConsV(interp(head), interp(tail) ) 我尝试使用这个解释器来划分元组,但效果不佳。我能用这个解释器解决这个问题吗?
  • @Chhong39 那么你应该在你的问题中提供可重现的代码。目前无法重现“找到List[Expr],需要List[Value]”。代码编译scastie.scala-lang.org/xKlWbV9uRSiqJKxBVKvDUA
  • @Chhong39 ConsEConsV 和其他定义的定义应该在您的问题中。
  • 非常感谢您投入时间。我添加了这些定义以及我尝试做的事情。
猜你喜欢
  • 2021-01-13
  • 2011-11-27
  • 2015-03-17
  • 2011-05-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多