から取得したエラーメッセージを置き換えるために、次のコードを作成しましたreadFile
。
module Main where
import Control.Error
import qualified Data.ByteString.Lazy as BSL
replaceLeftT :: Monad m => String -> EitherT String m a -> EitherT String m a
replaceLeftT message e = EitherT $ do
unwrapped <- runEitherT e
let x = case unwrapped of
Left _ -> Left message
y -> y
return x
main :: IO ()
main = runScript $ do
contents <- replaceLeftT "Could not read file" $
scriptIO $ BSL.readFile "somefile"
scriptIO $ putStrLn "Won't get here"
基本的な概念が欠けているように、私にはぎこちなく感じます。おそらく、試行錯誤の末にこの関数を導き出したからでしょう...
Control.Error
既存のプリミティブ、または一般的なモナドプリミティブを使用してこれを行う方法について何か提案はありますか?