@giwa has joined the channel
Makefile
とは。。。なぜcabalも使わなかったのか逆に気になりますね。。。IO (Either e a)
みたいな値は e
が Exception
のインスタンスとなるように変換した上で :point_down: みたいな関数で処理することが多いですね。throwOnLeft = either throwIO return
EitherT
コンストラクタを被せてdo文で書くと思います(リンクはMaybeTですが似たような感じで書けるはず) https://github.com/as-capabl/armageddon/blob/f5f6d676e00f508fe37efa77cedad89b58cf1023/app/Content.hs#L137main
関数のような、トップレベルに近い、「中の処理でいろいろな例外が起こりうるけどもう復帰できないから最後に最低限何が起きたのかログだけ書いておこう!」みたいな状況でを想定してました。(が、今回の場合全部同じエラーなのかな?)EitherT
は非推奨になったので,使うなら ExceptT
ですかね?ExceptT
については、局所的に使うのであれば、って感じですかね。。。>>>=
みたいな汎用的なインタフェースを用意しないで,こんな感じで書くのが好きですね... toks <- pure <$> runParser toTokens () fname input `catchEither` \e -> do printError e exitWith $ ExitFailure TOKEN_FAILURE_CODE ... catchEither :: Either a b -> (a -> b) -> b catchEither e f = either f id e printError :: (Show a) => a -> IO () printError x = do hPrint stderr x hPutStrLn stderr "\n\nPress Enter after reading this message." void getLine
IO
が絡むから >>>=
なんて作ったのかな、と思っていたけど、よく見たら IO (Either e a)
ですらないんですね。