0

HTTP リクエストを処理するための関数セットを作成しており、失敗を処理するための一連の例外を作成する必要があります。ここにあります

data HStream ty => ErrorResponse ty = ErrorResponse (Response ty)
data HStream ty => HttpException ty = WrongURIException String | ConnException ConnError | RequestException (ErrorResponse ty)
instance HStream ty => Exception (HttpException ty)

ここでWrongURIException、不正な uri、ConnExceptionTCP スタックのエラー、および 2xx 以外の応答コードで応答を処理する RequestException に対応します。3 行目で宣言instance Exceptionする前に、Typeable を派生させる必要がありますが、型がわかりません。どうすればいいですか?

4

1 に答える 1

7

そうしないことをお勧めします。データ型コンテキストは、あらゆる点で良くありません。廃止されたのには理由があります。本当に、本当に、それらが必要な場合は、GADT を使用してください。

コンテキストを使用しない場合、これは簡単です

 {-# LANGUAGE DeriveDataTypeable #-}
 import Data.Typeable
 import Data.Data


 data ErrorResponse ty = ErrorResponse (Response ty)
                       deriving(Data, Typeable, Show)
 data HttpResponse ty = WrongURIException String 
                      | ConnException ConnError
                      | RequestException (ErrorResponse ty)
                       deriving(Data, Typeable, Show)
 instance (Typeable ty, Show ty) => Exception (HttpException ty)

Typeable特に GHC 7.8 では、との独自のインスタンスを作成することはできないため、Data導出が正しい方法です。

于 2014-04-16T11:31:53.457 に答える