11

我正在学习 Learn You a Haskell for Great Good,我已经达到了第 8.4 节,“派生实例”。在本节中,有以下数据类型声明:

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'

通过更正我删除了错误lastnamelastName

问题:

在错误消息中,该词(visible)向我暗示必须有可能将字段声明为 hidden / invisible。这是正确的还是不正确的?如果是,我如何将构造函数中的字段声明为隐藏,以及需要声明隐藏字段的一般场景是什么?如果您可以通过给出一个简单的使用示例来解释这一点,那将不胜感激。

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

4

1 回答 1

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只有导出的是可见的。

于 2012-07-23T06:59:30.963 回答