我相信这个问题与 Haskell 结构本身的关系比 Persistent 的更重要,但是我一直在查看一些问题,我偶然发现了这个。
现在,我想知道,有没有办法在通过生成mkPersist
的自定义类型中使用生成的类型derivePersistField
?现在,采取以下措施,
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Model where
import Database.Persist.TH
import Data.Text
import Extra
share
[ mkPersist sqlSettings
, mkMigrate "migrateAll"
, mkDeleteCascade sqlSettings
] [persistLowerCase|
User
ident Text
passwd Text
person Person
Regular
name Text
username Text
birth Day
Admin
authLvl Int
|]
{-# LANGUAGE TemplateHaskell #-}
module Extra where
import Database.Persist.TH
data Person = PersonRegular | PersonAdmin
deriving (Show, Read, Eq)
derivePersistField "Person"
问题是,Extra需要在Model中导入,没问题;但是,如果我要在类型内部RegularId
使用Regular
表格中的,Person
data Person = PersonRegular RegularId | PersonAdmin AdminId
我还需要在 Extra 中导入模型,这会导致导入周期。
有没有办法解决这个问题并实现我的目标?排除将所有内容放在同一个模块中的可能性,因为它会给我带来 GHC 阶段限制。我也考虑过使用{-# SOURCE #-}
和 hs-boot,但由于某种原因,堆栈仍然抱怨导入周期,而是使用 hs-boot 文件。