Получать 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