我相信这个问题比持久性问题更与Haskell结构本身有关,但是我一直在这里浏览一些问题,偶然发现了this。
现在,我想知道是否有办法在通过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"
问题是,需要在Model中导入Extra,这很好;但是,如果要使用RegularId
表中Regular
表中的Person
,
data Person = PersonRegular RegularId | PersonAdmin AdminId
我还需要在Extra中导入模型,这会导致导入周期。
是否可以解决该问题并实现我的目标?排除将所有内容放在同一模块中的可能,因为这将使我受到GHC阶段的限制。我还考虑过使用{-# SOURCE #-}
和hs-boot,但是出于某种原因,堆栈仍然抱怨导入周期,但是使用了hs-boot文件。