为什么Scalaz \ / type有getOrElse但没有得到?

时间:2014-10-23 04:23:57

标签: scala scalaz

据我所知,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

2 个答案:

答案 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 可以用同样的方式构建。

相关问题