可选字段,ADT或?

时间:2016-08-24 19:09:48

标签: scala

给定A,其可能包含可选字段ab

case class A(a: Option[Int], b: Option[String])

我可以将A定义为Algebraic Data Type

但是,每个None/Option选项需要4个子类:

sealed trait AADT
case class Aa(a: Int) extends AADT
case class Aab(a: Int, b: String) extends AADT
case class Ab(b: String) extends AADT
case object Neither extends AADT

我认为此ADT优于上述A选项,其中包含Option种类型。

但是,这种类型很快就会失去3,4等字段。

是否有第三种实施A的方法,即不使用我的第一次或第二次实施?

2 个答案:

答案 0 :(得分:4)

代数上有第三个选项涵盖所有组合

sealed trait A
case class Ao(o: Option[(Int, String)]) extends A //all or none
case class Ae(e: Either[Int, String]) extends A //first or second

如果每个案例都有一个单独的域名,我肯定会选择某种ADT。

可选字段适用于数据传输对象(DTO)

答案 1 :(得分:0)

这是我想到的第一件事,在评论部分发布它几乎不可读。它绝对不是一个最漂亮的解决方案,但可能足够好'对于OP的案例。

ValueError: Could not unserialize key data.

只需使用正确的参数调用sealed trait AADT case class Aa(a: Int) extends AADT case class Aab(a: Int, b: String) extends AADT case class Ab(b: String) extends AADT case object Neither extends AADT object AADTBuilder { def apply() = Neither def apply(a: Int) = Aa(a) def apply(a: Int, b: String) = Aab(a, b) def apply(b: String) = Ab(b) }