首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数数据构造函数和GADT:非作用域数据构造函数

参数数据构造函数和GADT:非作用域数据构造函数
EN

Stack Overflow用户
提问于 2021-11-04 18:34:40
回答 1查看 60关注 0票数 0

我有一个核心Haskell文件: Relation.hs

定义了一些数据类型。

代码语言:javascript
复制
{-# LANGUAGE GADTs,MultiParamTypeClasses,ScopedTypeVariables,TypeSynonymInstances,FlexibleInstances #-}

module Relation where

data SchemaField schemaField where
  SchemaField :: (Eq fieldType) => {
    name :: String,
    fieldType :: fieldType,
    nullable :: Bool
  } -> SchemaField (String,fieldType,Bool)

data ValueField valueField where
  ValueField :: (Eq valueField,Ord valueField) => valueField -> ValueField valueField

type Schema schemaField = [SchemaField schemaField]

type MaybeValueField valueField = Maybe (ValueField valueField)
type Row valueField = [MaybeValueField valueField]
type Rows valueField = [Row valueField]

data Relation schemaField valueField = Relation {
  schema :: Schema schemaField,
  rows :: Rows valueField
  }

然后,我得到了测试文件: RelationTest.hs

它需要使用下面的关系构造函数:

代码语言:javascript
复制
{-# LANGUAGE MultiParamTypeClasses #-}

module RelationTest where

import Relation (FromValueToSchema,bindType,schema,rows,Relation)

data FieldType =
  StringType | IntType -- Char | Bool | Integer | Float | Double
  deriving (Show,Eq)

consistentSchema = [SchemaField "name" StringType False,SchemaField "ID" IntType True]
createdRelation = Relation {schema = consistentSchema, rows = []}

但是当我编译RelationTest.hs时,我不理解这个错误:不在作用域:数据构造函数的关系‘

从理解上看,关系构造函数是在Relation.hs中定义的。

我可以删除“导入关系”中的细节.在RelationTest.hs中,它工作得很好。

但是我想保持详细的进口。

当删除此导入时,在GHCi解释器中,我可以看到关系构造函数类型:

代码语言:javascript
复制
*Main> import Relation
*Main Relation> :t Relation
Relation
  :: Schema schemaField
     -> Rows valueField -> Relation schemaField valueField

那么,我在我的详细进口中错过了什么呢?

我检查了这两个StackOverflow线程,但没有找到任何解决方案:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-04 19:39:40

RelationTest.hs文件中,您将使用以下方法从Relation模块导入特定类型的构造函数:

代码语言:javascript
复制
import Relation (FromValueToSchema,bindType,schema,rows,Relation)

当涉及数据类型时,这只导入类型构造函数。不导入数据构造函数、可能的方法和字段名。将(..)添加到类型构造函数或类的末尾将导入其所有可能的成员。如下:

代码语言:javascript
复制
import Relation (FromValueToSchema,bindType,schema,rows,Relation(..))

Haskell报告第5.3.1节规定:

可以通过以下三种方式之一指定要导入的实体:

  1. 通过在括号中列出导入的实体,可以显式地指定它们。清单中的项目具有与出口清单中的项目相同的形式,但不允许使用限定符,也不允许使用“模块模型”实体。当(..)导入的形式用于类型或类,(..)引用从模块导出的所有构造函数、方法或字段名。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69844212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档