让我们在这里讨论同构。我有一个实现isomoprhism的类,它被称为 ISO 类。我从代码战中的kata解决方案中得到了这个类。可以看到同构的参考here。这个类有许多函数来表示同构异义的特征。首先,我可以理解该类的某些功能背后的逻辑。但是,在某些时候,我陷入了这两个功能。这给了我两个问题,这些问题可以在下面的部分看到。
static <A, B> ISO<A, B> isoUnOptional(final ISO<Optional<A>, Optional<B>> iso) {
return iso(
a -> iso.fw(Optional.of(a))
.orElseGet(() -> iso.fw(Optional.empty()).get()),
b -> iso.bw(Optional.of(b))
.orElseGet(() -> iso.bw(Optional.empty()).get()));
}
static ISO<Either<Stream<Unit>, Unit>, Either<Stream<Unit>, Void>> isoEU() {
return iso(
l -> l.pm(
ll -> Either.left(Stream.concat(Stream.of(Unit.INSTANCE), ll)),
r -> Either.left(Stream.empty())),
r -> r.pm(
l -> {
List<Unit> lu = l.collect(Collectors.toList());
return lu.isEmpty() ?
Either.right(Unit.INSTANCE) :
Either.left(Stream.generate(() ->
Unit.INSTANCE).limit(lu.size() - 1));
},
Void::absurd));
}
每个功能都给我一个问题。问题是我不理解return语句的内部工作。我知道syntax,但我不知道它的逻辑。有人可以向我解释这两个问题的逻辑吗?