code: @Override
      @SuppressWarnings("RedundantTypeArguments")
      public <R2> Either<L, R2> flatMap(Function<? super R, ? extends Monad<R2, Either<L, ?>>> rightFn) {
          return match(Either::left, rightFn.andThen(Monad<R2, Either<L, ?>>::coerce));
      }
docs: If a right value, unwrap it and apply it to <code>rightFn</code>, returning the resulting
  <code>Either&lt;L ,R&gt;</code>. Otherwise, return the left value.
  <p>
  Note that because this monadic form of <code>flatMap</code> only supports mapping over a theoretical right value,
  the resulting <code>Either</code> must be invariant on the same left value to flatten properly.
  
  @param rightFn the function to apply to a right value
  @param <R2>    the new right parameter type
  @return the Either resulting from applying rightFn to this right value, or this left value if left