2014-04-16 1 views
0

HTTP 요청을 처리하는 함수 집합을 작성 중이며 오류 처리를위한 예외 집합을 만들어야합니다. 여기에서는 TCP 스택 비 및 2xx 응답 코드로 응답을 처리 할 수있는 오류에 RequestException WrongURIException 조작 된 URI에 대응인스턴스 생성 컨텍스트로 유형 지정 가능

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) 

, ConnException이다. 라인 3에 instance Exception을 선언하기 전에 Typeable을 파생해야하지만 유형이 손실됩니다. 어떻게해야합니까?

답변

7

아니요, 일 수도 있습니다. 가능한 모든면에서 데이터 유형 컨텍스트가 좋지 않습니다. 그들이 비추천 된 이유가 있습니다. 정말로, 정말로 원하는 경우 GADT를 사용하십시오. 당신이 컨텍스트를 사용하지 않는 경우

, 이것은 당신이 TypeableData에 대한 자신의 인스턴스를 만들 수 없습니다 GHC 7.8로 특히

{-# 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) 

사소한, 그래서 유도하는 올바른 방법입니다.

+0

알아두기. 그렇지만 컴파일러가 어떤 종류의 응답 본문을 사용해야할지 결정하기 위해 예외에 2xx가 아닌 응답을 첨부해야합니다? –