Scala не удалось решить проблему несоответствия типов в сложном сгенерированном коде - PullRequest
1 голос
/ 15 февраля 2020

У меня есть следующие настройки, и я пытаюсь пройти проверку типа компиляции кода, желательно с минимальной модификацией, поскольку код генерируется инструментом, а не вручную.

Я думаю, что проблема в том, Мне нужно придумать лучшее определение для T_MAX_LATTICE [T] или T_IntegerMaxLattice в M_TEST_COLL.

Код довольно большой, поэтому я не могу опубликовать весь код здесь, но помещаю URL репо внизу , Я изо всех сил пытаюсь визуализировать иерархию типов.

Я знаю, что вопрос слишком общий, но все, что я ищу, - это возможность скомпилировать код без использования снятия флажка и минимального изменения кода времени выполнения (или основы * 1023). * .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(); }
  }

URL репо

1 Ответ

3 голосов
/ 15 февраля 2020

Попробуйте заставить M_MAX_LATTICE расширить не только 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 = ???
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...