Database “哈斯克尔”;持久的;模型:如何正确定义交叉引用?
假设您有两个模型(Foo和Bar),它们都彼此有引用(Foo具有barRef类型BarId和Bar具有fooRef类型FooId)。一切顺利:Database “哈斯克尔”;持久的;模型:如何正确定义交叉引用?,database,haskell,model,haskell-persistent,Database,Haskell,Model,Haskell Persistent,假设您有两个模型(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 #-} {-# LAN
#!/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 ()
但如果我将引用类型包装为可能是(仅举一个例子,它可能是向量或其他任何内容):
它失败,出现以下错误:
Not in scope: type constructor or class ‘BarId’
我该如何解决这个问题?您用于
条形图的语法不正确。像这样的方法应该会奏效:
#!/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 ()
请参阅以获取参考。实际上,我在使用Vector时遇到了这个问题,出于某种原因,我认为此语法仅适用于Maybe,例如适用于可为空的字段。但我现在意识到,这是任何包装器的一般语法,顺序相反。因此,对于barModel::Maybe(Vector(BarId))
,它甚至可能是barModel-BarId-Vector-Maybe
。谢谢@我不确定这样的事情会不会成功。测试一下,让我们知道。我错了,这不是那样的,也许
只是一个特例。
#!/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 ()