Write Yourself a Scheme in 48 Hoursを読んでいる。4章のエラーチェッキングのあたり。
LispErrorを定義して、それをHaskellの組み込みのエラー関数で使えるようにする。
MonadErrorのインスタンスにすればthrowErrorとcatchErrorが使えるが、そのためにはEither型の左側をErrorクラスのインスタンスにする必要がある。
instance Error e => MonadError e (Either e) where throwError = Left Left l `catchError` h = h l Right r `catchError` _ = Right r
コード中ではここ。
type ThrowsError = Either LispError instance Show LispVal where show = showVal instance Show LispError where show = showError instance Error LispError where noMsg = Default "An error has occurred" strMsg = Default
typeで別名をつけているのは取り回しを楽にするためかな?Error モナドを読んでも
type ParseMonad = Either ParseError
ってやってるし、エラーを取り扱う場合のお作法なのかなぁ。