2

我相信这个问题与 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 文件。

4

0 回答 0