Haskell 构造函数中的不可见/隐藏字段

Haskell 构造函数中的不可见/隐藏字段,haskell,types,derived-types,derived-instances,Haskell,Types,Derived Types,Derived Instances,我正在努力,我已经达到了目标。在本节中,有以下数据类型声明: data Person = Person { firstName :: String , lastName :: String , age :: Int } deriving (Eq) 试着 *Main> mikeD == Person {firstName = "Michael", las

我正在努力,我已经达到了目标。在本节中,有以下数据类型声明:

data Person = Person { firstName :: String  
                     , lastName :: String  
                     , age :: Int  
                     } deriving (Eq)
试着

*Main> mikeD == Person {firstName = "Michael", lastname = "Diamond", age = 43}
我得到了以下错误:

<interactive>:55:41:
`lastname' is not a (visible) field of constructor `Person'
:55:41:
`“lastname”不是构造函数“Person”的(可见)字段
通过将
lastname
更正为
lastname
我消除了错误

问题:

在错误消息中,单词
(可见)
提示我,必须有可能将字段声明为隐藏/不可见
。这对不对?如果是,我如何将构造函数中的字段声明为隐藏字段,以及需要声明隐藏字段的一般场景是什么?如果你能用一个简单的例子来解释这一点,我将不胜感激


注意:我在LYAH中找不到任何关于隐藏或不可见字段的引用/详细信息。

可以隐藏记录的字段或任何数据类型的构造函数,尽管不在声明站点。其想法是简单地选择不从模块导出该构造函数和/或字段,如下所示:

module MyModule (DT(C1, int, mStr)) where

data DT = C1 -- visible
             { 
               int :: Int, -- visible
               str :: String -- hidden
             }
        | C2 -- hidden
             {
               dbl :: Double, -- hidden
               mStr :: Maybe String -- visible
             }

请注意,
MyModule
中的所有内容仍然可以访问构造函数和所有四个字段,但在导入
MyModule
的其他模块中,只有导出的字段可见。

“但是,不可能导出给定构造函数的某些字段,也不可能导出同一构造函数的其他字段。”<代码>模块MyModule(DT(C1,int))仅导出
int
,而不导出
str
。还要注意,您的
DT(C1)
没有导出任何字段,因此
int
str
在代码示例中不可见。@sepp2k我不知道!我会更正我的答案,谢谢。“只作为函数可见,而不是字段”-也不是真的。你可以用它来更新记录。不,它没有被更正。你导出它的方式并不重要。您试图实现的目标(“仅作为函数可见,而不是作为字段可见”)根本不可能实现。为此,必须将其定义为函数,而不是字段。