Вы можете преобразовать свои вспомогательные функции из возврата Aff (Either String a)
в ExceptT String Aff a
. ExceptT
- это монадный преобразователь, который содержит вместо значения Either e a
, что означает, что ваш скомпилированный код будет выглядеть примерно так же. Но на исходном уровне вы можете игнорировать ошибки до конца и, таким образом, получать удобочитаемость и уменьшать дублирование.
Если вы управляете источником вспомогательных функций, просто перепишите их напрямую: вместо возврата Left
используйте throwError
, а вместо возврата Right
используйте pure
.
Если, с другой стороны, вы не управляете исходным кодом помощников, вы можете преобразовать их с помощью другой небольшой вспомогательной функции:
eitherToExcept :: forall e a. Aff (Either e a) -> ExceptT e Aff a
eitherToExcept action = either throwError pure <$> lift action
Теперь ваша функция main
может выполнять всю работу в монаде ExceptT
, позволяя ей распространять ошибки за сценой, и только в конце используйте runExceptT
для преобразования результата обратно. до Either
:
main = launchAff_ $ either errorShow (liftEffect <<< logShow) $ runExceptT do
let searchTerm = "PureScript"
credentials <- eitherToExcept $ readConfig "./config/twitter_credentials.json"
tokenCredentials <- eitherToExcept $ getTokenCredentials credentials
results <- eitherToExcept $ showResults tokenCredentials searchTerm
pure $ "Response:" <> (show results.statuses)
P.S. Здесь и там могут быть некоторые опечатки, так как у меня не было времени компилировать и проверять код.