arrow-kt Either konsumowanie wartości

0

SIemanko, mam pewien problem z ArrowKt, mianowiście jak obsługiwacprzypadek gdy mamy jakąś wartość i chcemy ją skonsumować (np. wyswietlić na konsoli)? W Vavrowym EIther to tego służy peek(), w Arrow nie ma chyba podobnej metody. Popatrzyłem jak to jest w Scalii robione, to chyba jest po prostu pattern matching wywoływany.
Wiem że moge zrobić map:

  Either.right(5).map { i -> println(i) }

Ale to raczej nie jest dobre rozwiązanie :D
@jarekr000000 @Wibowit funkcyjne świry pomóżcie xD

1

W Scali nie trzeba pattern matchingu, są kombinatory:
https://scastie.scala-lang.org/3dfJInPWQsyh3klT750nTQ

trait Whatever
val left: Either[String, Whatever] = Left("this is left")
val right: Either[Whatever, String] = Right("this is right")
println("print left:")
left.foreach(println) // nothing printed
println("print left swapped:")
left.swap.foreach(println) // prints "this is left"
println("print right:")
right.foreach(println) // prints: "this is right"

Co do Kotlina i arrow-kt to się nie znam.

0
scibi92 napisał(a):

Popatrzyłem jak to jest w Scalii robione, to chyba jest po prostu pattern matching wywoływany.

A dlaczego w Kotlinie pattern matching miałby być gorszy?

val x = magic("2")
val value = when(x) {
    is Either.Left -> when (x.a){
        is NumberFormatException -> "Not a number!"
        is IllegalArgumentException -> "Can't take reciprocal of 0!"
        else -> "Unknown error"
    }
    is Either.Right -> "Got reciprocal: ${x.b}"
}
3

Zapewne nie znajdziesz takiej metody bo łamiesz referential transparency (zakładam, że arrow-kt stara się robić rzeczy poprawnie i nie udostępnia takich możliwości).

Można sobie poradzić tak jak napisał @Kamil Żabiński, czyli zwrócić konkretną wartość i dopiero potem wywołać side effect. Jeśli chcesz ominąć pattern matching to powinieneś mieć jakieś foldy w arrow-kt.
Jakbyś chciał iść w pure FP to musiałbyś bawić się w IO, ładnie opakować side-effecty i wtedy dałoby się to w miarę łatwo zrobić.

Oczywiście, jeśli nie obchodzi Cię referential transparency to map(...) też jest ok... :)

0

@DisQ @Kamil Żabiński dziękuje za odpowiedzi. Oczywiście nie twierdzę że zastosowanie pattern matchingu jest złe bo akurat keczup ma całkiem dobry pattern matching, po prostu zastanawiałem się skąd różnice w stosunku do Vavra. Generalnie moja wiedza z FP jest jeszcze mała (jestem na poziomie niemutowalności i monad typy Try, Either Option etc

0
scibi92 napisał(a):

@DisQ @Kamil Żabiński dziękuje za odpowiedzi. Oczywiście nie twierdzę że zastosowanie pattern matchingu jest złe bo akurat keczup ma całkiem dobry pattern matching, po prostu zastanawiałem się skąd różnice w stosunku do Vavra. Generalnie moja wiedza z FP jest jeszcze mała (jestem na poziomie niemutowalności i monad typy Try, Either Option etc

Zapewne twórcy Vavra stwierdzili, że Javy i tak już nic nie uratuje to mogą dodać taką metodę ;) Nikt raczej się nie oszukuje, że z Javy nie zrobi się nagle full FP języka więc i takie metody mają tam sens. Co do pierwotnego pytania, to arrow-fx na nie odpowiada, aczkolwiek chwilowo polecałbym skupić się na corze, a dopiero potem pójść w fx - będzie łatwiej :)

1

Nikt raczej się nie oszukuje, że z Javy nie zrobi się nagle full FP języka więc i takie metody mają tam sens.

Java nie ma po prostu potrzebnych elementów w składni które ma Kotlin (pozdrawiam @Shalom :) ) Pytanie tez czy to aż tak przydatne w świecie biznesu ;)

Co do pierwotnego pytania, to arrow-fx na nie odpowiada, aczkolwiek chwilowo polecałbym skupić się na corze, a dopiero potem pójść w fx - będzie łatwiej

Tak wiem, jak już mówiłem w sumie ten core jakiś straszny dla mnie nie jest bo już coś z tego ogarnąłem w ramach Vavra, tylko tak jest ta "płytka funkcyjność" -> niemutowalne kolekcje, monady Try/Either/Option/Future. Generalnie chce napisac prosty funkcyjny web-scraper więc IO na pewno tam będzie :D

Edit, ogarnąłem ze jest fold :D


 val either = Either.right(5)
      .fold(ifLeft = { x :Any -> println(x)}, ifRight = { y -> println(y)})

1 użytkowników online, w tym zalogowanych: 0, gości: 1