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

Opt*_*ght 11 haskell types derived-types derived-instances

我正在通过学习你是一个很好的Haskell,我已达到第8.4节"衍生实例".在本节中,有以下数据类型声明:

data Person = Person { firstName :: String  
                     , lastName :: String  
                     , age :: Int  
                     } deriving (Eq)
Run Code Online (Sandbox Code Playgroud)

一边试试

*Main> mikeD == Person {firstName = "Michael", lastname = "Diamond", age = 43}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

<interactive>:55:41:
`lastname' is not a (visible) field of constructor `Person'
Run Code Online (Sandbox Code Playgroud)

通过纠正lastnamelastName我删除了错误.

题:

在错误消息中,该词(visible)暗示我必须有可能将字段声明为隐藏/不可见.这是否正确?如果是,我如何将构造函数中的字段声明为隐藏,以及需要声明隐藏字段的一般情况是什么?如果您可以通过给出一个简单的使用示例来解释这一点,那将是值得赞赏的.

注意:我找不到有关LYAH中隐藏或隐藏字段的任何参考/详细信息.

Pth*_*ame 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
             }
Run Code Online (Sandbox Code Playgroud)

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

  • "但是,不可能导出给定构造函数的某些字段,而不能导出同一构造函数的其他字段." 是的.`模块MyModule(DT(C1,int))`只导出`int`,而不是`str`.另请注意,您的`DT(C1)`不会导出任何字段,因此`int`和`str`在您的代码示例中是不可见的. (3认同)