如何解决我应该如何为元组实现Scala解释器?
我正在实现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],需要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的“构造器无法实例化为预期的类型”错误。我该如何解决?
解决方法
尝试替换
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?
开始然后,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],需要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
,它只能匹配普通的scala List
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。