scala - Scala 无法解决复杂生成代码中的类型不匹配问题
问题描述
我有以下设置,我试图通过代码的编译类型检查,最好进行最少的修改,因为代码是由工具而不是手动生成的。
我认为问题是我需要为 M_TEST_COLL 中的 T_MAX_LATTICE[T] 或 T_IntegerMaxLattice 提出更好的定义。
代码有点大,所以我不能在这里发布整个代码,但我把 repo URL 放在了底部。我正在努力可视化类型层次结构。
我知道这个问题太笼统了,但我所寻找的只是能够在不使用 uncheck cast 和对运行时代码(或 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(); }
}
解决方案
尝试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 = ???
}
推荐阅读
- html - 多次使用 br 标签来创建导航菜单是否合适?什么是更好的选择?
- python - 通过将数据帧的行和列索引与另一个数据帧的列匹配来重新格式化数据帧
- mongodb - Mongoose/MongoDB - 我可以通过映射包含的 id 数组来查找文档吗?
- python - 对将提取 html 代码并从网站显示它的 tkinter GUI 进行故障排除?
- c - 无符号整数的上溢和下溢
- javascript - 来自`function`的Javascript`new`的奇怪行为
- javascript - 'this' 隐含类型为 'any'
- pandas - 熊猫移动平均线日期
- mysql - MySQL 查询 - 加入 3 个表计数并按一列分组
- python - Python代码通过django shell而不是通过文件执行