1

这将是一个基本问题,但我无法找到解决方案。我需要从任一类型下方的右侧值中初始化一个常量。

val test: Either<String, Int> = 1.right()

我尝试了类似下面的方法,但它缩小了常量的范围。

when(test) {
        is Either.Right -> {val get:Int = test.b}
        is Either.Left -> println(test.a)
    }

我希望get将其范围限定在when语句之外。有没有办法做到这一点,或者 Arrow 不是为此目的而制作的?

4

1 回答 1

8

重要的问题是:如果 Either 是 会发生什么Left。在此示例中,它是在靠近使用它的位置创建的,因此作为开发人员,这对您来说是显而易见的。但是对于编译器来说,里面的内容Either可以是 anInt或 a String

您可以使用例如 fold 提取值:

val x = test.fold({ 0 }, {it}) // provide 0 as default in case the Either was a `Left`
// x = 1

另一种选择是getOrElse

val test = 1.right()
val x = test.getOrElse { 42 } // again, default in case it was a `Left`
// x = 42

您也可以在不打开包装的情况下使用它:

val test = 1.right()
val testPlus10 = test.map { it + 10 } // adds 10 to `test` if it is `Right`, does nothing otherwise
val x = testPlus10.getOrElse { 0 } // unwrap by providing a default value
// x = 11

有关更多示例,请查看官方文档

推荐阅读:如何从 Monad 中获取价值

于 2020-05-12T21:24:56.077 回答