1

これが私の問題です

次のタイプの例外処理に Control.Exception.catch を使用しています: (Hoogle から抜粋)

catchSource
:: Exception e   
=> IO a 
The computation to run
-> (e -> IO a)  
Handler to invoke if an exception is raised
-> IO a  

ハンドラー関数に渡すコンストラクターは次のとおりです

> data JobException = PreProcessFail
>                   | JobFail
>                   | ChartFail
>                       deriving (Show, Typeable)

> instance Control.Exception JobException

現在のハンドラー関数は次のとおりです。

> exceptionHandler :: JobException -> IO ()
> exceptionHandler exception = do
>    writeFile "testException.txt" ("caught exception " ++ show exception )

これを使用して、いくつかのログを記録します。ログに記録する必要がある情報は、タイプ JobState のレコードになります

> type JobState = MVar ProcessConfig

> data ProcessConfig = PConfig { model :: ServerModel
>                              , ipAddress :: String
>                              , cookie :: Cookie
>                              } deriving Show

したがって、上記のタイプを強制されるハンドラーが必要であり、JobState が必要なので、JobException を書き直して JobState を内部に隠すことが答えになると考えました。それはGADTの仕事のようです!わかりません、これは新しい領域です。

私は正しいですか?これをGADTで解決できますか?誰かがそれを構築し始める方法の手がかりを提供できますか? 私が読んでいるチュートリアルは、私が得たものよりも複雑な問題を解決しようとしていると仮定しています。

私が間違っている場合、誰かが私を正しい方向に向けることができますか?

更新: 1から動的型について学び、その後すぐに Data.Dynamic を見つけました。暖かくなる?

ファントム型を楽しむ

4

1 に答える 1

3

例外の Show インスタンスは、主に、例外を自分で処理せず、プログラムの別の場所 (トップ レベルなど) に出力される場合に使用されます。カスタム ハンドラーで例外をキャッチしているので、例外を入れて単純なインスタンス JobStateを与えることができるはずです。Show

例えば:

data JobState = JobSuccess | JobFail deriving Show 
newtype JobException = JobException (MVar JobState) deriving Typeable
instance Show JobException where
    show _ = "JobException"
instance Exception JobException

exceptionHandler :: JobException -> IO ()
exceptionHandler (JobException m) = takeMVar m >>= print
于 2011-09-15T02:40:19.727 に答える