servant
exampleの一部を見て、私は次を参照してください。GenericはAesonのToJSONクラスとどのような仕組みで対話していますか?
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneriC#-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Prelude()
import Prelude.Compat
import Control.Monad.Except
import Control.Monad.Reader
import Data.Aeson.Types
import Data.Attoparsec.ByteString
import Data.ByteString (ByteString)
import Data.List
import Data.Maybe
import Data.String.Conversions
import Data.Time.Calendar
import GHC.Generics
import Lucid
import Network.HTTP.Media ((//), (/:))
import Network.Wai
import Network.Wai.Handler.Warp
import Servant
import System.Directory
import Text.Blaze
import Text.Blaze.Html.Renderer.Utf8
import qualified Data.Aeson.Parser
import qualified Text.Blaze.Html
type UserAPI1 = "users" :> Get '[JSON] [User]
data User = User
{ name :: String
, age :: Int
, email :: String
, registration_date :: Day
} deriving (Eq, Show, Generic)
instance ToJSON User
は、私がGeneric
のderiving
を削除すると、私は次のエラーを得た:
• No instance for (Generic User)
arising from a use of ‘aeson-1.1.2.0:Data.Aeson.Types.ToJSON.$dmtoJSON’
だから、それはそのGeneric
型クラスのインスタンス表示されますUser
の場合instance ToJSON User
を有効にすると、User
のJSON Encoder
を作成すると仮定しています。
instance ToJSON User
の機械は何ですか、タイプシグネチャ、それは正しい単語ですか?
私は、stack ghci
からその型を見しようとしてすなわちREPLが、失敗しています:
λ: >:t instance
<interactive>:1:1: error: parse error on input ‘instance’
λ: >:i instance
<interactive>:1:1: error: parse error on input ‘instance’
'インスタンスToJSON User'は単なる通常のクラスインスタンスです。あなたはおそらく 'インスタンスToJSONユーザー{{}} 'を見るのに慣れています。インスタンスの本文に何もない場合は、 'where'を省略することができます(実際に' DeriveAnyClass'を有効にすると 'User'の' deriving'節に 'ToJSON'だけを置くことさえできます)。 'Generic'が" ToJSON "を有効にする理由は、' ToJSON'は[Generic'に依存するデフォルトの実装](https://hackage.haskell.org/package/aeson-1.2.1.0/docs/Data -Aeson.html#v:toJSON)。 – Alec