«Постоянная» модель Haskell: как правильно определить перекрестную ссылку? - PullRequest
0 голосов
/ 09 сентября 2018

Представьте, что у вас есть две модели ( Foo и Bar ), и они обе имеют ссылки друг на друга ( Foo имеют barRef с типом BarId и Bar имеют fooRef с типом FooId ). Все идет хорошо:

#!/usr/bin/env stack
{- stack script --resolver=lts-9.21 --package=persistent-template -}
{-# LANGUAGE GADTs, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

import Database.Persist.TH

mkPersist sqlSettings [persistLowerCase|
Foo
  barModel BarId
  fooField Int

Bar
  fooModel FooId
  barField Int
|]

main = pure ()

Но если я оберну справочный тип в Может быть (просто пример, он может Vector или что-нибудь еще):

#!/usr/bin/env stack
{- stack script --resolver=lts-9.21 --package=persistent-template -}
{-# LANGUAGE GADTs, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

import Database.Persist.TH

mkPersist sqlSettings [persistLowerCase|
Foo
  barModel (Maybe BarId)
  fooField Int

Bar
  fooModel FooId
  barField Int
|]

main = pure ()

Ошибка с этой ошибкой:

Not in scope: type constructor or class ‘BarId’

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 09 сентября 2018

Синтаксис, который вы используете для модели Bar, неверен. Примерно так должно работать:

#!/usr/bin/env stack
-- stack script --resolver lts-12.7

{-# LANGUAGE GADTs, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

import Database.Persist.TH

mkPersist sqlSettings [persistLowerCase|
Foo
  barModel BarId Maybe
  fooField Int

Bar
  fooModel FooId
  barField Int
|]

main = pure ()

См. официальные документы для справки.

...