2016-08-24 35 views
3

给定一个A,可能有可选字段,ab可选字段,ADT或?

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

我可以定义A作为Algebraic Data Type

然而,这将要求4的子类,以考虑各None/Option选择:

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,即不使用我的第一个或第二个实施?

+0

你意识到,选项[A]本身就是一个ADT吧? – pedrofurla

+0

我的第一个想法是反对你的提议,认为Option本身已经提供了一些有用的方法,比如map,flatMap,filter等。但是另一方面A是单形的。 – pedrofurla

+1

一个尝试过的方式(实际上很无聊)是使用'(Option [Int],Option [String])''。但为了弥补这种无聊,我提供了第四种选择,使用Int,String,(Int,String)和None两者的无形副产品。 – pedrofurla

回答

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

好赶上!真的很喜欢。 – pedrofurla

0

这是我想到的第一件事,在评论部分张贴它几乎不可读。这绝对不是一个最漂亮的解决方案,但对OP来说可能是'够用'。

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) 
} 

并调用AADTBuilder用正确的参数。

+0

我不认为问题是关于如何构建,而是如何构建。 – pedrofurla

+0

是的,我误读了,会留下答案,因为有人可能会发现它方便@pedrofurla – sebszyller