介绍
我们在这里谈谈同构。我有一个实现等态的类,它被称为ISO类。我有这个类来自代码战中 kata 的解决方案。同构的参考可以在这里看到。这个类有很多函数来表示等态的特征。起初,我可以理解类的一些功能背后的逻辑。但是,在某些时候,我被这两个功能卡住了。这给了我两个问题,这些问题可以在下面的部分中看到。
问题 1
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()));
}
问题 2
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 语句的内部工作。我知道语法,但我不知道它的逻辑。有人可以向我解释这两个问题的逻辑吗?
笔记
- 这里的逻辑术语与内部工作术语相同。
- 代码的完整结构如下所示。
完整代码
完整代码:ISO类的完整代码