Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何实现元组的scala解释器?_Scala_Interpreter_Type Mismatch - Fatal编程技术网

我应该如何实现元组的scala解释器?

我应该如何实现元组的scala解释器?,scala,interpreter,type-mismatch,Scala,Interpreter,Type Mismatch,我正在实现scala解释器,我遇到了一些问题 首先,我想实现tuple类 在myValue.scala中,存在以下类: case class TupleV(values: List[Type]) extends Value 另外,在myExpr.scala中,存在以下类 case class TupleE(expressions: List[Type] extends Expr Type也位于Expr.scala中,如下所示: sealed trait Type case object In

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

首先,我想实现
tuple

在my
Value.scala
中,存在以下类:

case class TupleV(values: List[Type]) extends Value
另外,在my
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)
case TupleE(values)=>TupleV(values)
因此,我按照如下方式实施:

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)
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)
}
 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 TupleE(values)=>TupleV(values)
你在写翻译

def interpret(expr: Expr): Value
i、 e.继续你在中开始的内容

那么
TupleV
TupleE
的定义应该在后面。以前他们上面的定义对我来说没什么意义

当您键入检查
Expr

def typecheck(expr: Expr): Type // or Option[Type]
然后你会有一个层次结构

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

因此,我按照如下方式实施:

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)
case TupleE(values)=>TupleV(values)
但它说List[Expr]已找到,List[Value]是必需的。问题是什么 我的代码有问题吗?我该怎么修呢

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

用这个,我试着

case TupleE(expression)=>expression match{
  case ConsE(head, tail)=>ConsV(head, tail)
}
 case TupleE(expression)=>expression match{   
   case ConsE(head, tail)=>ConsV(head, tail)
 }
但它返回:“构造函数不能实例化为预期类型” ConsE的错误


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

什么是
type
?不应该是
TupleV(值:List[Value])extends Value
TupleE(值:List[Expr])extends Expr
?请提供显示错误的真实代码,而不是带有语法错误的片段。至少您需要显示包含
案例
语句的
匹配
。不确定这是否仍然相关,但我在您的问题
中找到了
类型
的定义密封特征类型
案例对象IntT扩展类型
…这与此问题的类型相同。当有人告诉我只关注一个问题时,我改变了问题的格式。我也编辑了我的问题。谢谢你的回答。但是,为case类TupleV和TupleE提供的那些定义是为了练习,我无法更改。在本练习中,它包含ConsE函数,允许我将列表划分为head和tail,并将其写成case ConsE(head,tail)=>ConsV(interp(head),interp(tail))我试图用这个解释器来划分元组,但效果不好。我能用这个解释器解决这个问题吗?@Chhong39那么你应该在你的问题中提供可复制的代码。当前无法复制“
List[Expr]
found,
List[Value]
是必需的”。代码编译@Chhong39关于
ConsE
ConsV
和其他定义的定义,这应该是您的问题。非常感谢您投入时间。我添加了这些定义和我试图做的事情。