2013-10-12 13 views
10

Tôi đang sử dụng gói aeson. Tôi có một kiểu dữ liệu sử dụng Data.Tree trong tuyên bố của nó. Như sau, chỉ phức tạp hơn:Làm thế nào để tránh tạo ra một ví dụ FromJSON mồ côi cho Data.Tree

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

Tôi muốn sử dụng Data.Aeson.TH để tạo ra một trường hợp FromJSON cho loại này.

$(deriveJSON defaultOptions ''Foo) 

Nhưng Data.Tree không có một trường hợp tiêu chuẩn cho FromJSON, có nghĩa là tôi sẽ cần phải khai báo một instace đứa trẻ mồ côi.

Có cách nào để tránh tạo trường hợp trẻ mồ côi, trong khi vẫn có thể sử dụng deriveJSON?

+1

Điều này có được sử dụng trong thư viện hay không cho ứng dụng bạn đang viết? Nếu đó là một ứng dụng, không có gì sai với một thể hiện trẻ mồ côi. –

+0

@Gabriel Gonzalez Nó sẽ được sử dụng trong thư viện. – danidiaz

Trả lời

4

Để cho một cá thể kinh điển (ví dụ: không phải là trẻ mồ côi), cần phải được định nghĩa trong cùng một mô-đun như trình tạo kiểu (Data.Tree) hoặc khai báo lớp học (Data.Aeson.Types). Vì vậy, cách duy nhất để xác định một cá thể không mồ côi sẽ là ngã ba aeson (kể từ aeson tùy thuộc vào vùng chứa).

Tôi muốn giới thiệu filing a ticket với aeson hoặc có thể là yêu cầu kéo để thêm nó vào thượng nguồn. Cho đến lúc đó, nếu bạn không định phân phối mã, xác định một thể hiện trẻ mồ côi không gây ra nhiều rắc rối. Nếu bạn đang làm việc trên mã bạn muốn xuất bản, giải pháp an toàn nhất là tạo một trình bao bọc newtype quanh Tree, sau đó tạo một phiên bản FromJSON cho kiểu mới.

Các vấn đề liên quan