据我所知,Scalaz的\/
没有get
方法。有时我确定\/
中包含的值是正确的值,我不想使用getOrElse
。我想直接得到它。
("3".right[Int]) getOrElse("123123123") // 3
if (t.isRight) t.get // compilation error, no get method
如果有保证,我如何直接获得正确的价值。
我有两种方法可以获得价值,但两者看起来都有点冗长。
1:更改为scala
val t = "3".right[Int]
val either = t.toEither
if (either.isRight) either.right.get
else either.left.get
2:使用getOrElse
("3".right[Int]) getOrElse("123123123") // but for some cases I don't have this default value
答案 0 :(得分:5)
没有get,因为get 可以抛出异常,这并不酷。 Scalaz通过不允许直接访问该值来强制执行此操作。
如果您提供更多信息,我们可以提供解决方案。
t should be safe.
val safe_thing:T = ???
val either: Throwable \/ T = getFromSomewhere
either getOrElse safe_thing
答案 1 :(得分:0)
正如其他答案所指出的,typealias TestClosure = ((message: String) -> ())
var testArray = [[TestClosure]](count: 4, repeatedValue: [])
可以投掷。但是与OP类似,我也遇到了一种情况,当我确定一个类型(在这种情况下是get
),但代码中的变量是\/-
类型(超类)。
进行内联模式匹配非常冗长,看起来很糟糕。
\/
所以我写了这个帮手:
println(("test".right[String] |> { case \/-(x) => x; case _ => "" }).toUpperCase)
用法很简单,这是一个例子:
implicit class ScalazDisjunctionPimps[A, B](e: \/[A, B]) {
def getRight: B = e match {
case \/-(x) => x
case _ => throw new RuntimeException(s"$e is not right.")
}
}
如果需要 println("test".right.getRight.toUpperCase) // outputs: TEST
可以用同样的方式构建。