私がタイプを持っているとしましょうPerson
import GHC.Generics
import Data.Text
import Data.Aeson
import Control.Lens
data Person = Person {
_firstName :: Text,
_lastName :: Text,
_age :: Int
} deriving (Show, Generic)
そして、レンズと JSON 型クラスを自動的に派生させたい
makeLenses ''Person
instance FromJSON Person
instance ToJSON Person
これは正しく機能しますが、DeriveGeneric はフィールド名にアンダースコアが含まれていると見なし、JSON がそれに応じてフォーマットされることを期待します。
{ "_firstName": "James" ... etc} -- The underscore doesn't belong here.
明らかに、data
定義自体からアンダースコアを削除makeLenses
できますが、必要なゲッターとセッターを派生させることはできません。
理想的には、私ができるようになりたいのは、このようなものです
let person = decode blob
let name = person ^. firstName
つまり、使用している JSON-REST Api の値とすべてのフィールド名が正しく並んでいるレンズと JSON インスタンスを、多くのボイラープレートを記述することなく派生できるようにしたいと考えています。
これはとても簡単なことのように思えるので、明らかな何かが欠けていると感じますか?