Определите пользовательский тип, используя постоянные сгенерированные типы

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

0 ответов

Другие вопросы по тегам