0

介绍

我们在这里谈谈同构。我有一个实现等态的类,它被称为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 语句的内部工作。我知道语法,但我不知道它的逻辑。有人可以向我解释这两个问题的逻辑吗?

笔记

  1. 这里的逻辑术语与内部工作术语相同。
  2. 代码的完整结构如下所示。

完整代码

完整代码:ISO类的完整代码

4

0 回答 0