我有一个代数数据类型的声明 在一个模块中使用该数据结构,在另一个模块中使用。
在Convert.hs
中,我有
module Convert (makeTables, Table) where
data Table = Table {
headers :: [[String]],
datarows :: [[String]]
}
deriving (Show)
-- ...
在另一个模块中,我有:
import Convert
titles :: Table -> [String]
titles t = map (intercalate " ") (headers t)
显然,编译器知道Table
,因为它确实传递了函数签名。但是,headers
字段名称不可用:
Variable not in scope: headers :: Table -> [[[Char]]]
|
10 | titles t = map (intercalate " ") (headers t)
| ^^^^^^^
对此有任何补救措施吗?预先非常感谢。
答案 0 :(得分:5)
您需要导出数据类型的字段:
module Convert (makeTables, Table(..)) where
-- ~~~~
当前,您仅导出数据类型本身,因此它是不透明的,这些字段是Convert
模块专用的。如果您想要只能使用某些公共API构造或操作的数据结构,这将很有用。 (例如“智能构造函数”模式。)
通常,如果您计划导入不合格的Convert
,则应在字段名称前加上前缀,以免与其他内容冲突:
data Table = Table
{ tableHeaders :: [[String]]
, tableDataRows :: [[String]]
} deriving (Show)
但是您也可以保持原样并导入合格的模块,例如:
import Convert (Table)
import qualified Convert
titles :: Table -> [String]
titles t = map (intercalate " ") (Convert.headers t)