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