Chcę napisać funkcję saveStuff
, która zapisuje coś do pliku, po przejściu niektórych testów. Jeśli testy zakończą się niepowodzeniem, muszę zgłosić błąd. Jaki powinien być typ wyniku tej funkcji? Pomyślałem o IO (Either String())
i IO (Maybe String)
, ale obaj z nich czują źle z jakiegoś powodu. Wyszukałem podobne funkcje z biblioteki standardowej, ale po prostu wydają się zwracać IO()
. Wyrzucają wyjątki w razie awarii. Nie mogę znaleźć takiego podejścia.Jaki powinien być typ wyniku tej funkcji?
Odpowiedz
Można rozważyć coś pisze, że zwraca ErrorT String IO()
. Dokumentacja dla transformatora monad ErrorT
to on Hackage. W znakomitym numerze Eight Ways to Report Errors znalazło się więcej sugestii Erica Kidda i follow up kilka lat później Edwarda Yanga.
"ErrorT" jest tym, o czym myślałem. Masz to, co zasadniczo jest 'IO()', i chcesz dodać potencjał do błędu z komunikatem, więc po prostu uderz w niego transformator 'ErrorT'. –
Jeśli istnieje tylko jeden sposób, aby saveStuff
mógł się powieść, typ izomorficzny na Maybe ErrorMessage
jest poprawny. Maybe ErrorMessage
sam ma wadę, która zwykle oznacza, że Nothing
oznacza błąd podczas używania Maybe
, więc byłoby to sprzeczne z oczekiwaniami tutaj. W związku z tym, Either ErrorMessage()
jest lepszy, ale parametr ()
do przypadku Right
nie zawiera żadnych informacji, dlatego ta opcja również nie ma elegancji.
Jeśli nie chcą przyjąć tych niedociągnięć, określić własny typ wynik
data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example
- 1. Jaki jest typ tej samoczynnej funkcji silni?
- 2. Jaki typ zawartości powinien być używany do prezentacji XML + XSL?
- 3. Jaki powinien być typ zawartości dla błędu 4xx bez ciała?
- 4. Jaki typ powinien zwrócić myCustomDictionary.Values?
- 5. Jaki typ IEnumerable powinien zwrócić INotifyDataErrorInfo.GetErrors?
- 6. Jaki powinien być czas trwania sesji NHibernate?
- 7. Czy istnieje dobra praktyka, gdy typ powinien być zapakowany?
- 8. Gdzie powinien być startup.m?
- 9. Jaki powinien być typ zawartości, aby pobrać dowolny format pliku w jsp?
- 10. Jaki typ danych serwera SQL powinien być używany do przechowywania bajta []
- 11. Jaki typ obrazu WPF powinien być użyty do przeprowadzenia wielu przekształceń
- 12. Jaki powinien być sizeof (int) na 64-bitowym komputerze?
- 13. Jaki typ wyjątku powinien zostać zgłoszony przy użyciu usługi WCF?
- 14. Jaki typ powinien std :: remove_cv produkować na tablicy const T?
- 15. Jeśli wysyłam pythonowi obiekt "Signal" z funkcji, jaki powinien być argument "nadawca"?
- 16. typ docelowy tej wypowiedzi musi być funkcjonalny interfejs
- 17. runda, ale .5 powinien być powleczony
- 18. Rspec: Powinien być (ten lub inny).
- 19. C: ostrzeżenie: X może być użyty niezainicjowany w tej funkcji
- 20. Model MVC C++ - jak powinien być wdrożony?
- 21. Czy token APNS powinien być zaszyfrowany?
- 22. Dla metody typu T, jaki powinien być jej typ "wywnioskowany", gdy przyjmuje dwa argumenty: <? super T>?
- 23. Powrót Typ wyniku String z Struts2
- 24. Gdzie powinien być kod menedżera django?
- 25. Jak wyjątkowy powinien być klucz komponentu React?
- 26. Czy std :: atomic powinien być lotny?
- 27. Jak duży powinien być obraz UIBarButtonItem?
- 28. Formularz się zamyka, gdy nie powinien być
- 29. Tabela mieszania: dlaczego rozmiar powinien być najlepszy?
- 30. Android: Gdzie powinien być zdefiniowany/zarejestrowany OnSharedPreferenceChangeListener?
Jeśli może się powieść tylko w jeden sposób, "Maybe ErrorMessage" lub coś takiego jest typem izomorficznym. Jeśli nie lubisz 'Maybe', ponieważ zwykle' Nic' wskazuje na niepowodzenie, użyj 'data Result = Success | Failure String'. –
@ Daniel Fischer: To jest prawdopodobnie dobre jako odpowiedź (a nie komentarz). –