database - Haskell“持久”模型:如何正确定义交叉引用?
问题描述
想象一下,您有两个模型(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 ()
但是如果我将引用类型包装为Maybe(只是一个例子,它可以是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’
我应该如何解决这个问题?
解决方案
您用于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 ()
请参阅官方文档以供参考。
推荐阅读
- haskell - 如何更新元组列表中的元素?
- docker - Ubuntu 上缺少 Docker 容器
- java - 无法通过key找到缓存
- git - .DS_Store 尽管未被跟踪,但在我的 Git 存储库中显示为待处理的更改
- python - Raspberry Pi 3B+ 上的 Adafruit_DHT“int 错误”
- .net - 如何使用 ITelemetryInitializer 为 ApplicationInsights 公开 HttpContext
- mysql - 将数据从一个 mysql 表发送到另一台服务器上的另一个 mysql 表
- javascript - 如何将不同的元素组合推入新数组?
- swift - SwiftUI 奇怪的动画行为
- python - 为什么在这个 SQL 表中找不到这个列,当表定义时包含它?