Either
从 Scala 2.12 开始是右偏的,这使得它可以在 for/yield 块中使用,而无需投影,就像Option
。但显然这还不足以表现得像Option
当与flatMap
.
object Main {
def main(args: Array[String]): Unit = {
val nums = List.range(1,10)
println(nums.flatMap(evenOption))
println(nums.flatMap(evenEither)) // fails
}
def evenOption(x: Int): Option[Int] = if (x % 2 == 0) Some(x) else None
def evenEither(x: Int): Either[String, Int] = if (x % 2 == 0) Right(x) else Left("not even")
}
我最少的范畴论知识让我认为Either
不是一个单子,因此失败了?或者我还能如何使上面的例子起作用?
它与是否是单子无关。当你执行时flatMap
某些数据结构上的方法,您传递到的函数必须返回该数据结构的实例。因此,当您对选项进行平面映射时,您的函数必须返回一个选项。如果您要对 Future 进行平面映射,则您的函数必须返回 Future。列表也是如此:列表上的平面映射必须返回列表本身。那么为什么你的List.flatMap(Option)
工作和List.flatMap(Either)
不是吗?因为存在从 Option 到 Iterable 的隐式转换 (Option.option2Iterable
),并且该转换发生在您的示例中。 Either 数据类型没有这样的转换(除非您自己创建它)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)