无法识别代数数据类型字段名称

时间:2019-01-09 03:48:20

标签: haskell

我有一个代数数据类型的声明 在一个模块中使用该数据结构,在另一个模块中使用。

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)
   |                                   ^^^^^^^

对此有任何补救措施吗?预先非常感谢。

1 个答案:

答案 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)