使用持久性生成的类型定义自定义类型

时间:2018-12-07 16:27:30

标签: haskell haskell-persistent

我相信这个问题比持久性问题更与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文件。

0 个答案:

没有答案