【问题标题】:Scala failing to resolve a type mismatch problem in a complicated generated codeScala 无法解决复杂生成代码中的类型不匹配问题
【发布时间】:2020-05-30 17:41:20
【问题描述】:

我有以下设置,我正在尝试通过代码的编译类型检查,最好进行最少的修改,因为代码是由工具生成的,而不是手动生成的。

我认为问题是我需要为 M_TEST_COLL 中的 T_MAX_LATTICE[T] 或 T_IntegerMaxLattice 提出一个更好的定义。

代码有点大,所以我不能在这里发布整个代码,但我把 repo URL 放在了底部。我正在努力可视化类型层次结构。

我知道这个问题太笼统了,但我正在寻找的是能够在不使用取消选中强制转换和对运行时代码(或 basic.handcode.scala)的最小修改的情况下编译代码

错误(1 和 2):

Type mismatch. Required:
  C_NUMERIC [ T_IntegerMaxLattice ] 
  Found: M_MAX_LATTICE [ T_Integer ] 


Type mismatch. Required:
   C_NUMERIC [ T_IntegerMaxLattice ] 
   Found: M_MAX_LATTICE [ T_Integer ] 

生成的代码:

问题 #1:

class M_TEST_COLL[T_T](name : String,val t_T : C_TYPE[T_T] with C_TINY[T_T])
  extends Module(name)
    with C_TEST_COLL[T_T,T_T]
{
  type T_Result = T_T;
  val v_equal = t_T.v_equal;
  val v_string = t_T.v_string;
  val v_assert = t_T.v_assert;
  val v_node_equivalent = t_T.v_node_equivalent;
  type T_Root = t_T.T_Root;
  val t_Root = t_T.t_Root;
  type T_Wood = t_T.T_Wood;
  val t_Wood = t_T.t_Wood;
  val p_root = t_T.p_root;
  val v_root = t_T.v_root;
  val p_branch = t_T.p_branch;
  val v_branch = t_T.v_branch;
  val p_leaf = t_T.p_leaf;
  val v_leaf = t_T.v_leaf;

  val t_Result : this.type = this;
  val t_IntegerMaxLattice = new M_MAX_LATTICE[T_Integer]("IntegerMaxLattice",t_Integer,0);
  type T_IntegerMaxLattice = /*TI*/T_MAX_LATTICE[T_Integer];
  private class E_foo(anchor : Null) extends Evaluation[Null,T_IntegerMaxLattice](anchor,"foo") {
    override def getDefault = new M__basic_4[ T_IntegerMaxLattice](t_IntegerMaxLattice).v__op_s(1,2);
    override def compute : ValueType = c_foo();
  }

问题 #2:

  def c_foo() : T_IntegerMaxLattice = {
    Debug.begin("foo");
    try {
      return new M__basic_4[ T_IntegerMaxLattice](t_IntegerMaxLattice).v__op_s(1,2);
    } finally { Debug.end(); }
  }

Repo url

【问题讨论】:

    标签: scala generics types


    【解决方案1】:

    尝试使M_MAX_LATTICE 不仅像previous 问题中那样扩展C_TYPE,而且还扩展C_NUMERIC

    class M_MAX_LATTICE[T_TO]
    (name : String, t_TO:C_ORDERED[T_TO],v_min_element : T_TO)
      extends M_MAKE_LATTICE[T_TO](name,t_TO,v_min_element,
        new M__basic_3[ T_TO](t_TO).v__op_z,
        new M__basic_3[ T_TO](t_TO).v__op_z0,
        new M__basic_13[ T_TO](t_TO).v_max,
        new M__basic_13[ T_TO](t_TO).v_min)
        with C_MAX_LATTICE[T_TO,T_TO] with C_ORDERED[T_TO]
        with C_TYPE[T_TO] with C_NUMERIC[T_TO]
    {
      val v_less = t_TO.v_less;
      val v_less_equal = t_TO.v_less_equal;
      override val v_assert: T_TO => Unit = ???
      override val v_node_equivalent: (T_TO, T_TO) => T_OrLattice = ???
      override val v_string: T_TO => String = ???
      override def v_zero: T_TO = ???
      override def v_one: T_TO = ???
      override val v_plus: (T_TO, T_TO) => T_TO = ???
      override val v_minus: (T_TO, T_TO) => T_TO = ???
      override val v_times: (T_TO, T_TO) => T_TO = ???
      override val v_divide: (T_TO, T_TO) => T_TO = ???
      override val v_unary_plus: T_TO => T_TO = ???
      override val v_unary_minus: T_TO => T_TO = ???
      override val v_unary_times: T_TO => T_TO = ???
      override val v_unary_divide: T_TO => T_TO = ???
    }
    

    【讨论】:

    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2018-01-30
    • 2016-12-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多