【发布时间】:2021-03-23 07:02:37
【问题描述】:
我有以下需要建模的类型:
sealed trait FieldType
case object INT extends FieldType
case object UINT extends FieldType
case object FLOAT extends FieldType
case object DOUBLE extends FieldType
case object BOOL extends FieldType
case object STRING extends FieldType
case object DATETIME extends FieldType
case class LIST(fieldType: FieldType) extends FieldType
case class SET(fieldType: FieldType) extends FieldType
我遇到的问题是实际上LIST 和SET 实际上是包含FieldType 的ComplexFieldType。 换句话说,LIST 不能包含 List 或 SET,SET 也是如此。
什么是建模的正确方法,以确保穷举性问题,即让编译器告诉我何时我缺少一些值。
我尝试像 SimpleFieldType 和 ComplexFieldType 那样引入中间密封特征,但后来模式匹配搞砸了。
我看到的唯一解决方案是我不想像中那样复合
case object LIST_INT
是为LIST和SET使用智能构造函数。
不过,我想写个便条,看看 scalaSphere 知道些什么。
【问题讨论】:
-
中间特征是合适的解决方案,你不需要匹配中间特征只匹配最终值。
-
为什么不用Scala提供的TypeTag?
-
@texasbruce 这增加了对
scala-reflect的依赖,运行时反射比较慢,而且2.x中有bugs的反射,目前还没有积极修复。
标签: scala types algebraic-data-types