Определите пользовательский тип, используя постоянные сгенерированные типы
Я полагаю, что этот вопрос больше связан с самой структурой 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.