为什么Aeson将()编码为空数组?

lam*_*das 3 json haskell aeson

我很惊讶地知道Aeson编码()为空阵列.这种行为背后的原因是什么?我觉得null会更自然,我错了吗?

*Main> encode ()
"[]"
Run Code Online (Sandbox Code Playgroud)

Lyn*_*ynn 7

ToJSON例如()被定义为:

instance ToJSON () where
    toJSON _ = emptyArray
    {-# INLINE toJSON #-}
Run Code Online (Sandbox Code Playgroud)

因为通常,元组被编码为数组:

instance (ToJSON a, ToJSON b) => ToJSON (a,b) where
    toJSON (a,b) = Array $ V.create $ do
                     mv <- VM.unsafeNew 2
                     VM.unsafeWrite mv 0 (toJSON a)
                     VM.unsafeWrite mv 1 (toJSON b)
                     return mv
Run Code Online (Sandbox Code Playgroud)

(我认为null没有多大意义;通常null表示缺少值可能存在的值,所以在Haskell中你会使用Nothing.实际上,encode Nothing返回"null".()只是一个0元组,这个实例与其他实例更一致元组).