Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Beam代码仅在一个模块中工作_Haskell_Haskell Beam - Fatal编程技术网

Haskell Beam代码仅在一个模块中工作

Haskell Beam代码仅在一个模块中工作,haskell,haskell-beam,Haskell,Haskell Beam,我在Schema模块中定义了DatasourceId,如下所示 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 Pri

我在
Schema
模块中定义了
DatasourceId
,如下所示

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
但我无法在
模式
模块之外使用它,如中所示

(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文档本身有这样的用法(文档中嵌入的代码)。请参见

中定义的
CustomerId
,这是一种不直观的情况,发生在使用附加类型的任何地方,而不是特定于梁

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

模式中导出如下内容:

module Schema( ..., B.PrimaryKey(..), ... ) where
import Schema(PrimaryKey(..))
按如下方式在需要时导入:

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

导出应该是合格的,因此我认为您的意思是
模块模式(…,B.PrimaryKey(…),…),其中
是的,您是对的:在您的情况下,由于
Database.Beam.Schema
是作为合格导入的,因此您也应该参考
PrimaryKey
。我已经更新了答案。如果我有几个类型同义词,例如
typed2id=B.PrimaryKey D2T Identity
?“work”以什么方式工作?
Table
是一个类,而
PrimaryKey
是一个附加类型。这大致意味着“每个
的实例都必须附加一些
主键
的定义”。你正在定义两者。您正在将
PrimaryKey
的实例定义为
data
类型,其中一个构造函数名为
DatasourceId