- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码
open class Fail(override val message: String, override val cause: Throwable?) : RuntimeException(message, cause)
data class ValidationFail(override val message: String, override val cause: Throwable?) : Fail(message, cause)
以后会在那里定义更多的失败
我有两个功能
fun fun1(): Either<out Fail, A>
fun fun2(a: A): Either<out Fail, B>
当我尝试像这样调用它们时 fun1().flatMap{fun2(it)}
我得到了
Type mismatch: inferred type is (A!) -> Either<out Fail, B> but ((A!) -> Nothing)! was expected. Projected type Either<out Fail, A> restricts use of public final fun <U : Any!> flatMap(p0: ((R!) -> Either<L!, out U!>!)!): Either<L!, U!>! defined in io.vavr.control.Either
来自 vavr 的代码:
default <U> Either<L, U> flatMap(Function<? super R, ? extends Either<L, ? extends U>> mapper) {
Objects.requireNonNull(mapper, "mapper is null");
if (isRight()) {
return (Either<L, U>) mapper.apply(get());
} else {
return (Either<L, U>) this;
}
}
我猜 o 有这个错误是因为 flatMap 定义中有 L
而不是 ?扩展 L
有什么解决方法吗?
最佳答案
在您的特定情况下,您可以通过从 fun1
和 fun2
返回类型中删除 out
差异来使其编译。 You shouldn't use wildcard types as return types anyway .
但是,如果您以这种方式定义了 fun1
和 fun2
,那将无济于事:
fun fun1(): Either<ConcreteFail1, A>
fun fun2(a: A): Either<ConcreteFail2, B>
用 替换
也无济于事,因为 L
? flatMap
签名中的 extends LConcreteFail2
不是 ConcreteFail1
的子类型。问题是 Either
应该是协变的,但在 Java 中没有声明位点差异这样的东西。虽然有一个使用 Either#narrow
的解决方法方法:
Either.narrow<Fail, A>(fun1()).flatMap { Either.narrow(fun2(it)) }
当然,它看起来很奇怪,必须提取到一个单独的扩展函数中:
inline fun <L, R, R2> Either<out L, out R>.narrowedFlatMap(
crossinline mapper: (R) -> Either<out L, out R2>
): Either<L, R2> = narrow.flatMap { mapper(it).narrow }
narrow
是:
val <L, R> Either<out L, out R>.narrow: Either<L, R> get() = Either.narrow(this)
我认为 Vavr 没有提供它自己的 narrowedFlatMap
因为这个方法需要使用通配符接收器类型,所以它不能是一个成员方法,必须是一个静态的,它打破了操作流水线的所有可读性:
narrowedFlatMap(narrowedFlatMap(narrowedFlatMap(fun1()) { fun2(it) }) { fun3(it) }) { fun4(it) }
但由于我们使用 Kotlin,我们也可以管道化静态(扩展)函数:
fun1().narrowedFlatMap { fun2(it) }.narrowedFlatMap { fun3(it) }.narrowedFlatMap { fun4(it) }
关于kotlin - 如何使用带左方差注释的 flatMap vavr Either,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58841465/
当函数定义如下时 static Function1 fibonacci = Function((BigInteger value) -> value.equals(BigInt
是否有任何选项可以对 vavrs 集合应用对象分解? 即类似于 scala 中的代码片段: val x = List(1, 2, 3) val t = x match { case List(a,
我正在尝试找出使用 VAVR 的 Try 的惯用方法。我正在查看的用例必须执行以下步骤: - 获取鞋子列表(调用可以抛出一个已检查的异常) - 清洁每只鞋(调用可以抛出一个已检查的异常) - 恢复每双
我有方法: @GetMapping public Either,ResponseEntity>> readAllOrderedByStatus() { var result = taskCru
对于我的 API,我正在解析一个对象并使用 lombok 构建器创建我的对象。其中一个变量是 LocalDateTime 类型的“arrivalTime”,当然它可以为 null。 我以前是这样的:
我有几个Vavr Either ',我想为每个 Either 调用一个具有 Right 值的函数。例如: Either either1 = .. Either either2 = .. Either
把 Google Guava kool-aid 从我们嘴里吐了出来,并一头扎进我们对 VAVR 及其闪闪发光的理想的新迷恋中,假设我们正在 map()ping Stream,在 Traversable
我希望得到您关于如何以功能性方式正确编写此代码的建议: private Option calculate(Integer X, Integer Y) { if (X otherMethod(
我有这样的代码: return validators .stream() .flatMap(v -> v.validate(scoreRequest
考虑到 Vavr 提供 tuples ,是否可以将它们用于 capturing groups在正则表达式中? 以HTTP请求行作为示例字符串进行匹配 GET /resource HTTP 1.1 和匹
使用Vavr的类型,我创建了一对 Some s: var input = Tuple(Some(1), Some(2)); 我想使用 Vavr 的匹配表达式获取整数 1 和 2;这就是我目前的做法:
所以我有一个返回 Vavr Try 的方法: public Try request() {...} request来 self 无法修改的来源。目前,我对 request 的结果进行了平面映射。并取决
我正在使用来自 vavr 的集合图书馆。我有一个这样定义的元素列表: List integers = List.of(1, 2, 3); 如何迭代列表的元素并同时访问索引?在 Groovy 中有一个方
谁能解释一下为什么这段代码: interface Lol { default Try> lol() { return Try.of(List::empty); } } class Lo
VAVR 集合是“不可变的”。 那么,如果我有静态变量,例如,保存所有 WebSocket session ,我将如何使用 VAVR 以使集合是线程安全的? 例如: @ServerEndpoint("
您好,我正在尝试将 vavr 添加到我的项目中,现在我正在为 Vavr.List 对象的正确序列化而苦苦挣扎。下面是我的 Controller : import io.vavr.collection.
是否有一种简洁、惯用的方法来从 Javaslang/Vavr List 创建顺序保留映射? List.toMap() 返回一个普通的 HashMap,所以这并不能实现。我现在拥有的是这样的东西—— l
我正在浏览 Vavr Usage Guide的部分关于使用 Match 和他们称之为“语法糖”的其他“语法糖”执行副作用。这是那里给出的例子: Match(arg).of( Case($(is
我的代码 open class Fail(override val message: String, override val cause: Throwable?) : RuntimeExceptio
这是我的代码片段: public static void main(String[] args) { Try.of(Main::getLines) .onFailur
我是一名优秀的程序员,十分优秀!