Wpis z mikrobloga

@farmac: jak nie ma rzucania to nie widzę sensu używania Throwable, lepiej stworzyć własny typ i nie być przywiązanym do tego javowego

albo jeszcze lepiej w Validated[Throwable, T], bo na monadach nie da się kumulować errorów


@farmac: mówisz o takim Result, który jest applicative functor? Szczerze nie wiem, czy Rust ma coś takiego, pewnie nie
@Saly: no może się pośpieszyłem z tym Throwable, bo rzeczywiście w praktyce lepiej utworzyć własny typ reprezentujący errory, który dodatkowo pozwoli np. na tłumaczenie komunikatu przy zastosowaniu i18n
ad2: dokładnie, Validated jest applicative functorem
: lepiej opakować w Either[Throwable, T]


@farmac: przecież to jest właśnie odpowiednik rustowego Result. Oczywiście są drobne różnice w szczegółach, ale zasadniczo koncepcja jest ta sama. Co do kumulowania errorów to zdaje się anyhow to umie.
Co do kumulowania errorów to zdaje się anyhow to umie.


@Krolik: tu chodzi o inny rodzaj. Z tego co widzę to anyhow wspiera łancuch errorów przez co dany error trzyma w sobie przyczynę. W przypadku wspomnianego Validated chodzi o operację łączenia błędów w taki sposób, że wystąpienie pierwszego nie prowadzi do short circuitingu tj. kolejne funkcje sprawdzające się nie odpalą.

Rustowy Result ma metodę and_then, która jest operacją monadyczną wymuszającą
@Saly: @farmac: W Ruście jest też operator ?, który rozpakowuje Result i wykonuje wczesny return, korzystając z E::into(). Dzięki temu np. można robić unię wszystkich możliwych błędów, np. przy użyciu modułu this_error.

Jest też np. moduł miette (podobny do anyhow), który pozwala na tworzenie ładnych reportów z błędów.
@bajcik: Tak dokładnie, this_error pomaga stworzyć własne błędy w małych bibliotekach, gdzie chcesz użytkownikowi przekazać faktyczny typ błędu opakowany w jakiś kontekst.
Biblioteka Anyhow albo jego następcy, czyli eyre i miette, służą zbierania raportów z błędów i przekazywania ich użytkownikowi.