2016-08-24 18 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