@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) ですらないんですね。