scala - 我应该如何为元组实现 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] 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 的“构造函数无法实例化为预期类型”错误。我应该如何解决它?
解决方案
尝试更换
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
那么 , 的定义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)
expression
has type List[Type]
, it can't match ConsE
,它只能匹配普通的 scala List
。
推荐阅读
- ios - Swift 中的日期匹配在那里不起作用的代码
- c# - 显示表格 onclick 按钮 - jquery
- visual-studio-2015 - 如何在 MSI 中使用命令行参数
- google-chrome-extension - 扩展图标的放大镜
- javascript - 显示:无 & setAttribute() 不工作
- java - 如何在 ViewPager 和 TabLayout 中多次使用相同的 Fragment 类?
- solr - Solr 给出错误的字段长度
- java - 如何阻止我的代码多次打印“升序”?
- c++ - 在 c++ 中使用 vtd-xml 时如何摆脱 EOFException?
- html - 如何在我的 html 中包含大量代码?