Краткий ответ : классы типов ToJSON
(и FromJSON
) из Data.Aeson
и Data.Yaml
совпадают . Data.Yaml
фактически выполняет только повторное импортирование из класса типов ToJSON
Data.Aeson
.
Если мы посмотрим на Data.Yaml
исходный код :
#if (defined (ghcjs_HOST_OS))
module Data.Yaml {-# WARNING "GHCJS is not supported yet (will break at runtime once called)." #-}
#else
<b>module Data.Yaml</b>
#endif
( -- * Types
Value (..)
, Parser
, Object
, Array
, ParseException(..)
, prettyPrintParseException
, YamlException (..)
, YamlMark (..)
-- * Constructors and accessors
, object
, array
, (.=)
, (.:)
, (.:?)
, (.!=)
-- ** With helpers (since 0.8.23)
, withObject
, withText
, withArray
, withScientific
, withBool
-- * Parsing
, parseMonad
, parseEither
, parseMaybe
-- * Classes
<b>, ToJSON (..)
, FromJSON (..)</b>
-- * Encoding/decoding
, encode
, encodeFile
, decode
, decodeFile
-- ** Better error information
, decodeEither
, decodeEither'
, decodeFileEither
-- ** More control over decoding
, decodeHelper
) where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative(())
#endif
import Control.Exception
<b>import Data.Aeson</b>
( Value (..), <b>ToJSON (..), FromJSON (..)</b>, object
, (.=) , (.:) , (.:?) , (.!=)
, Object, Array
, withObject, withText, withArray, withScientific, withBool
)
(...)
Таким образом, модуль экспортирует класс типов ToJSON
, но это только результат ToJSON
импорта Data.Aeson
, следовательно, класс типов на самом деле тот же.
Таким образом, он повторно импортируется для удобства программиста (например, вам не нужно импортировать Data.Aeson
только для реализации FromJOSN
), но на самом деле вы все еще работаете с теми же типами, теми же классами типов и т. Д. Ведь ваши ToJSON
и Y.ToJSON
относятся к тому же классу типов.
Поскольку оба на самом деле одинаковы, вы не можете дважды создать один и тот же класс типов для одного и того же типа, но нам не нужно этого делать: если мы реализуем его для Data.Aeson
(или Data.Yaml
), то есть достаточно, так как ограничения класса типов, которые, например, записаны в Data.Yaml
(или Data.Aeson
), будут успешными. Как следствие, мы не можем (по крайней мере, без некоторых хитростей) реализовать ToJSON
иначе для Data.Yaml
, чем для Data.Aeson
.