Lista eitherów - to zmapować

Lista eitherów - to zmapować
Bambo
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:779
0

Hej, @jarekr000000 i inni pro funkcyjni.

Jak mamy sobie listę obiektów T, które mapujemy metodą T -> Either<Error, T> i i chcemy zwrócić z metody Either<Error, R> gdzie R to wrapper na List<T> to jak to w sumie zrobić?
Chciałbym żeby finalny error to był ten pierwszy znaleziony.

Teoretycznie mogę kombinować isLeftem :D
Jest cuś lepszego?

edytowany 4x, ostatnio: Bambo
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

foldem to zrobisz. Zaczynasz od Either.Right(emptyList) i potem flatMap.
Ogólnie operacja której szukasz nazywa się mapM (albo sequence) i ze względu na bieda system typów w Kotlinie trzeba ją sobie ręcznie pisać dla każdej kombinacji monad (to na szczęśćie raz na miesiąc).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Bambo
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:779
0

@jarekr000000: Dla javy to tego mapM nawet nie chce znaleźć w google o.O

edytowany 1x, ostatnio: Bambo
jarekr000000
Bo to oczywiście nie w javie. W Hoogle się takich szuka :-)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Mogę sie mylić, ale wydaje mi się że jednak 100 razy czytelniej będzie tam wrzucić jednego biednego ifa i tyle, szczególnie jeśli chcesz wyciągnąć tylko pierwszy error z listy.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
jarekr000000
Punkt widzenia - zależy od punktu zaifienia.
Shalom
Czasem jednak taki jeden if można zrozumieć od razu, a takiego połamańca z flatmapami rozkminiasz godzinkę :D
S9
Wiedziałem że @jarekr000000 się striggeruje
jarekr000000
E... spoko - i tak się wszyscy nauczycie :-)
Bambo
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:779
0

Dobra, jako, że mam javę w projekcie to sobie po prostu napisałem utilsa i tam jest ten brzydki kod :/

Kopiuj
public static <T> Either<AppError, Traversable<T>> findFirstError(final Traversable<Either<AppError, T>> traversable) {
        for (var it : traversable.iterator()) {
            if (it.isLeft()) {
                return Either.left(it.getLeft());
            }
        }

        return Either.right(traversable.flatMap(it -> it));
    }
edytowany 2x, ostatnio: Bambo
jarekr000000
Ze smutnych rzeczy - nie wiem jak to napisać prosto i wydajnie(!) W sposób funkcyjny w javie na razie potrzebna mi minimum scala :-( (ale pokombinuje w wolnej chwili).
Bambo
Widzę, że nie tylko ja tak mam, że funkcyjne rozkminy potrafią sktutecznie zjadać godziny :D Kiedyś nad jakimiś flatmapami mniej trywialnymi siedziałem 5h XD. Btw @jarekr000000 a gdyby tak opakować to w Validation<T>? ;- on ma ma swoje combine. Widziałem, też że w tej najnowszej alfa wersji jest For() i yield
jarekr000000
sktutecznie zjadać godziny niby lepiej zjeśc te godziny raz, żeby przekonać kompilator, że jest dobrze, niż kilka razy siedzieć na debugu. Ale różnie bywa - szczególnie w javie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.