最も簡単な方法は、新しいException
タイプを作成することです(これは-XExistentialQuantification
を必要としない)表示することができる例外の。
data Exception = forall e . Show e => Exception e
次に、コードをコンパイルするために変更する必要があるのはすべてタイプシグネチャです。
funA :: String -> Except Exception String
funB :: String -> Except Exception T.Text
また、いつでもあなたは今Exception
コンストラクタでそれをラップする必要があります(上記のコードには例がないうち)例外を作成します。
throwsA :: String -> Except Exception String
throwsA = throwE . Exception
throwsB :: T.Text -> Except Exception T.Text
throwsB = throwE . Exception
EDIT私はControl.ExceptionからException
を導出その後、(適切なShow
で)あなたの例外のための新しいタイプを作成することをお勧めします。これはオーバーヘッドですが、異種の例外タイプ間を行き来する必要がある場合は、後で役立ちます。これが私のやり方です。
{-# LANGUAGE DeriveDataTypeable #-}
module Main where
import Data.Typeable
import Control.Exception
import Control.Monad.Trans.Except
import qualified Data.Text as T
import Control.Monad
newtype StrError = StrError String deriving (Show,Typeable)
newtype TxtError = TxtError T.Text deriving (Show,Typeable)
instance Exception StrError
instance Exception TxtError
toErr :: Exception e => Except e a -> Except SomeException a
toErr = mapExcept (either (Left . toException) Right)
funA :: String -> Except StrError String
funA = return
funB :: String -> Except TxtError T.Text
funB = return . T.pack
throwsA :: String -> Except StrError String
throwsA = throwE . StrError
throwsB :: T.Text -> Except TxtError T.Text
throwsB = throwE . TxtError
fun :: String -> IO()
fun s = case runExcept $ (toErr . funA >=> toErr . funB) s of
Left e -> putStrLn $ displayException e
Right _ -> return()
main :: IO()
main = fun "foo"
[Control.Exception](https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Exception.html)あなたが探しているもののようですSomeExceptionタイプを持っていますfor ... – Alec
@Alec:あなたのエラータイプを 'Exception'クラスのインスタンスにして' SomeException'を使うことをお勧めしますか? (名前にもかかわらず、例外は例外とは関係ありません)。うまくいく解決策のように聞こえる、私は本当にそれが良いかどうかは分からない。 –
さらに詳しく調べると、私はそれがまったく役に立たないと思います。 'Exception'クラスでは、' displayException :: e - > String'を実装する必要があります。 – Alec