我正在翻阅Learn You a Haskell for Great Good,我已达到section 8.4, "Derived Instances"。在本节中,有以下数据类型声明:
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'
通过将lastname
更正为lastName
,我删除了错误。
问题:
在错误消息中,单词(visible)
向我暗示必须有可能将字段声明为隐藏/不可见。这是否正确?如果是,我如何将构造函数中的字段声明为隐藏,以及需要声明隐藏字段的一般情况是什么?如果您可以通过给出一个简单的使用示例来解释这一点,那将不胜感激。
注意:我找不到任何关于LYAH隐藏或隐藏字段的详细信息。
答案 0 :(得分:12)
虽然不在声明站点,但可以隐藏记录的字段或任何数据类型的构造函数。我们的想法是简单地选择不从模块中导出该构造函数和/或字段,如下所示:
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
的其他模块中,只有导出的字段可见。