Ponieważ wcześniej uprościłem w moim other question, chciałbym podać tutaj wyraźniejszy przykład.Elegancka obudowa/obsługa błędów w sekwencyjnych monadach
W jaki sposób mogę obsłużyć sytuacje, w których muszę sprawdzić warunki certyfikując w sposób sekwencyjny bez zagnieżdżania wielu przypadków? Przez "sekwencyjny sposób" rozumiem uzyskanie wartości (np. Ze standardowego wejścia), sprawdzenie tej wartości dla określonego warunku i w zależności od wyniku uzyskania innej wartości i tak dalej.
Przykład:
sequen :: IO String
sequen = do
a <- getLine
case a of
"hi" -> do
putStrLn "hello!"
b <- getLine
case b of
"how are you?" -> do
putStrLn "fine, thanks"
return "nice conversation"
_ -> return "error 2"
_ -> return "error 1"
wiem, że istnieją lepsze sposoby, aby napisać taki czat bota, należy po prostu wykazać sekwencyjną naturę problemu. Jak widać, w przypadku każdego zagnieżdżonego przypadku kod również jest wcięty głębiej.
Czy istnieje sposób na lepszą strukturę takiego kodu? Zastanawiam się nad obsługą "błędów" w jednym miejscu i opisywaniem "ścieżki sukcesu" bez obsługi błędów rozproszonych po niej.
Awesome. Dokładnie to, co chciałem wiedzieć. Dziękuję Ci! –
Na notatce EitherT napisałem post na blogu, który został całkiem dobrze przyjęty: http://ocharles.org.uk/blog/posts/2012-07-24-in-praise-of-EitherT.html – ocharles
@ocharles Czytałem to jakiś czas temu i pomyślałem, że powinno to być rozwiązanie mojego problemu, ale nie mogłem go zastosować do tej pory. Możesz umieścić link do tego pytania w swoim poście :) –