2013-05-21 165 views
2

是否在一些庫中實現了可變參數計數scala Either,我的意思是類似於HList的東西。我不想自己實現它:-)斯卡拉可變參數計數

+1

'或者'只是一個具有兩個構造函數的特定和類型。您可以將自己的總和類型(使用盡可能多的構造函數;也就是代數數據類型)編寫爲擴展密封特徵的一組案例類或對象。 –

回答

1

這不是直接回答你的問題,而是你考慮過使用Scalaz的任一類型符號\/?這樣,您可以在「鏈」幾種類型一起在一個和類型,像這樣:

import scalaz._ 

lazy val a: Int \/ String = ??? 
// a: scalaz.\/[Int,String] = <lazy> 

lazy val b: Int \/ String \/ Double = ??? 
// b: scalaz.\/[scalaz.\/[Int,String],Double] = <lazy> 

lazy val c: Int \/ String \/ Double \/ BigInt = ??? 
// c: scalaz.\/[scalaz.\/[scalaz.\/[Int,String],Double],BigInt] = <lazy> 



val d1: Int \/ String \/ Double \/ BigInt = -\/(\/-(42d)) 
// d1: scalaz.\/[scalaz.\/[scalaz.\/[Int,String],Double],BigInt] = -\/(\/-(42d)) 

import Scalaz._ 

val d2: Int \/ String \/ Double \/ BigInt = 42d.right.left 
// d2: scalaz.\/[scalaz.\/[scalaz.\/[Int,String],Double],BigInt] = -\/(\/-(42d)) 



val e1: Int \/ String \/ Double \/ BigInt = -\/(-\/(\/-("42"))) 
// e1: scalaz.\/[scalaz.\/[scalaz.\/[Int,String],Double],BigInt] = -\/(-\/(\/-("42"))) 

import Scalaz._ 

val e2: Int \/ String \/ Double \/ BigInt = "42".right.left.left 
// e2: scalaz.\/[scalaz.\/[scalaz.\/[Int,String],Double],BigInt] = -\/(-\/(\/-("42"))) 

它還具有提取所以你可以匹配模式這些事情。

但是,如果您掌握了所有涉及的類型,那麼滾動您自己的代數數據類型(如上面的Travis Brown的評論所述)可能是更好的解決方案。