Мотивация: я хочу использовать MongoDB для хранения данных. Постоянная библиотека, похоже, является единственной высокоуровневой библиотекой Haskell, поддерживающей MongoDB. Мой проект уже определил типы, представляющие строки (документы) любой базы данных.
Типичным использованием постоянного является определение вашего типа через бит шаблона Haskell, например:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Database.Persist
import Database.Persist.TH
import Database.Persist.Sqlite
import Control.Monad.IO.Class (liftIO)
mkPersist mongoSettings [persistLowerCase|
Person
name String
age Int
deriving Show
|]
Тем не менее, у меня уже есть типы значительных размеров в коде, похожем на:
newtype Name = Name String deriving (Show, Etc, Etc)
data Person = Person
{ name :: Name, age :: Int } deriving (Show, Etc, Etc)
Так что в идеале я бы получал свои PersistEntity
и, возможно, даже PersistField
экземпляры через уменьшенный бит TH, такой как :
mkPersistFromType mongoSettings ''Person
Однако функции TH, такой как mkPersistFromType
, нет. Написание экземпляров классов вручную утомительно - они очень длинные. Какой правильный путь вперед? Есть ли где-нибудь mkPersistFromType
, которого я не видел, или мне самому написать?