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

Evg*_*eny 1 haskell

我在一个模块中声明了一个代数数据类型,并在另一个模块中使用了这个数据结构.

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)

有可能对此有任何补救措施吗?提前谢谢了.

Jon*_*rdy 5

您需要导出数据类型的字段:

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)