Получать Generic и ToJSON одновременно?

У меня есть модуль Foo.hs который содержит определение, которое не выводит Generic:

-- Foo.hs
data Blather = Blather ...  -- Generic not derived here

И в другом модуле я хочу получить ToJSON:

-- Bar.hs
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}

import GHC.Generics
import Data.Aeson

instance Generic Blather
instance ToJSON Blather

но это не компилируется. Если я выведу Generic в Foo.hs на сайте определения я могу позже вывести ToJSON в другом модуле.

Могу ли я получить ToJSON Blather в Bar.hs без изменения оригинала Foo.hs?

Или есть простой способ написать instance ToJSON Blather рукой?

1 ответ

Решение

Включить StandaloneDeriving и использовать deriving instance ... поскольку для этого не требуется, чтобы деривация находилась в том же модуле, что и тип данных.

Пример:

{-# LANGUAGE DeriveGeneric, StandaloneDeriving, DeriveAnyClass #-}

import GHC.Generics
import Data.Aeson
import Foo

deriving instance Generic Blather
deriving instance ToJSON Blather

main = undefined
Другие вопросы по тегам