是否在某个库中实现了可变参数计数 scala Either
,我的意思是类似于HList
. 我不想自己实现它:-)
问问题
288 次
1 回答
1
这不是您问题的直接答案,但您是否考虑过使用 Scalaz 的 Either 类型符号\/
?有了它,您可以在 sum 类型中将几种类型“链接”在一起,如下所示:
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 的评论中所述)可能是更好的解决方案。
于 2013-05-21T11:49:29.893 回答