2013-10-12 2 views
10

aeson 패키지를 사용하고 있습니다. 그 선언에 Data.Tree을 사용하는 데이터 유형이 있습니다. 만 더 복잡 다음과 같은 :DataTree의 고아 FromJSON 인스턴스 생성을 피하는 방법

data Foo = Foo { 
       bat :: Text 
      , xux :: Maybe Text 
      , tri :: Tree Text 
      } 

나는이 유형에 대한 FromJSON 인스턴스를 생성하는 Data.Aeson.TH를 사용하고 싶습니다.

$(deriveJSON defaultOptions ''Foo) 

그러나 Data.Tree 내가 고아 instace를 선언 할 필요가 있음을 의미 FromJSON위한 표준 인스턴스를 가지고 있지 않습니다.

deriveJSON을 계속 사용하면서 고아 인스턴스를 만들지 않는 방법이 있습니까?

+1

라이브러리 내에서 사용 하시겠습니까? 아니면 작성중인 응용 프로그램 용입니까? 응용 프로그램 인 경우 고아 인스턴스에는 아무런 문제가 없습니다. –

+0

@ Gabriel Gonzalez 도서관에서 사용됩니다. – danidiaz

답변

4

인스턴스가 정규 (즉, 고아가 아닌)되도록하려면 유형 생성자 (Data.Tree) 또는 클래스 선언 (Data.Aeson.Types)과 동일한 모듈에 인스턴스를 정의해야합니다. 따라서 고아가 아닌 인스턴스를 정의하는 유일한 방법은 aeson을 포크하는 것입니다 (aeson은 컨테이너에 따라 다르기 때문에).

업스트림에 추가하려면 filing a ticketaeson 또는 권유 요청으로 권장합니다. 그 때까지 코드를 배포 할 계획이 없다면 고아 인스턴스를 정의해도 많은 문제가 발생하지 않습니다. 게시하려는 코드로 작업하는 경우 가장 안전한 해결책은 Tree 주위에 newtype 랩퍼를 작성한 다음 newtype에 대해 FromJSON 인스턴스를 작성하는 것입니다.