【问题标题】:Haskell "persistent" model: How to correctly define cross-reference?Haskell“持久”模型:如何正确定义交叉引用?
【发布时间】:2019-02-14 06:27:54
【问题描述】:

假设您有两个模型(FooBar),它们都相互引用(FoobarRef 类型为 BarIdBar 具有 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’

我应该如何解决这个问题?

【问题讨论】:

    标签: database haskell model haskell-persistent


    【解决方案1】:

    您用于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 ()
    

    请参阅official docs 以供参考。

    【讨论】:

    • 我实际上在使用 Vector 时遇到了这个问题,出于某种原因,我认为这种语法只适用于 Maybe,就像只适用于可空字段.但我现在意识到,这是任何包装器的逆序通用语法。所以对于barModel :: Maybe (Vector (BarId)),它甚至可能是barModel BarId Vector Maybe。谢谢!
    • @unclechu 我不确定这样的事情是否会奏效。测试一下,让我们知道。
    • 我错了,这样不行,Maybe只是个特例。
    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多