2013-05-21 83 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的评论所述)可能是更好的解决方案。