gpt4 book ai didi

Haskell Beam 代码仅适用于一个模块

转载 作者:行者123 更新时间:2023-12-02 02:40:28 24 4
gpt4 key购买 nike

我有 DatasourceIdSchema 中定义像这样的模块

import qualified Database.Beam as B

data DatasourceT f = Datasource
{ _datasourceId :: B.C f Text
, _datasourceName :: B.C f Text
} deriving (Generic, B.Beamable)

instance B.Table DatasourceT where
data PrimaryKey DatasourceT f = DatasourceId (B.C f Text) deriving (Generic, B.Beamable)
primaryKey = DatasourceId . _datasourceId

type DatasourceId = B.PrimaryKey DatasourceT Identity

但我无法在 Schema 之外使用它模块如
(B.val_ $ DatasourceId $ _datasourceId d)

因为编译器提示
>     • Data constructor not in scope:
> DatasourceId :: t0 -> B.PrimaryKey DatasourceT Identity
> • Perhaps you meant 'Datasource' (imported from Schema)
> |
> 229 | (B.val_ $ DatasourceId $ _datasourceId d)

即使我有
import Schema (ControlAccessDb(..), Datasource, DatasourceId, DatasourceT(..))

那么有什么建议可以防止代码注定要被整合到一个模块中吗?这可能是类型家庭的怪癖吗?
看来问题出在
instance B.Table DatasourceT where
data PrimaryKey DatasourceT f = DatasourceId (B.C f Text) deriving (Generic, B.Beamable)
primaryKey = DatasourceId . _datasourceId

其中实例化内部仅对定义模块已知。

请注意,Beam 文档本身具有这种用法(文档中嵌入的代码)。见 https://tathougies.github.io/beam/user-guide/manipulation/insert/在哪里 CustomerId定义于 https://github.com/tathougies/beam/blob/d87120b58373df53f075d92ce12037a98ca709ab/beam-sqlite/examples/Chinook/Schema.hs#L119

最佳答案

这是一种有点不直观的情况,发生在任何使用附加类型的地方,而不是特定于 Beam。

因为DatasouceId是附加类型的构造函数PrimaryKey ,您需要导出和导入该类型,就像使用普通的非附加类型一样。这有点不直观,因为 PrimaryKey最初并未在您的模块中定义。但从某种意义上说,它是:您正在定义该类型的实例,因此您也可以导出它。我想这一定是这背后的有争议的逻辑。

从您的 Schema 导出像这样的模块:

module Schema( ..., B.PrimaryKey(..), ... ) where

像这样在需要的地方导入:
import Schema(PrimaryKey(..))

关于Haskell Beam 代码仅适用于一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59942593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com