3

から取得したエラーメッセージを置き換えるために、次のコードを作成しました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既存のプリミティブ、または一般的なモナドプリミティブを使用してこれを行う方法について何か提案はありますか?

4

1 に答える 1