Невидимое/скрытое поле в конструкторе

Я пашу через Учите вас Haskell для 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'

Откорректировав lastname до lastname, я удалил ошибку.

Вопрос:

В сообщении об ошибке слово (visible) намекает мне, что должна быть возможность объявить поле скрытым/невидимым. Это правильно или нет? Если это так, как я могу объявить поле в конструкторе как скрытое, и каковы общие сценарии, в которых нужно было бы объявлять скрытые поля? Если бы вы могли объяснить это, представив простой пример их использования, это было бы оценено.

Примечание. Я не мог найти ссылку на/подробности о скрытом или невидимом поле в LYAH.

Ответ 1

Можно скрыть поле записи или конструктор любого типа данных, хотя и не на сайте объявления. Идея состоит в том, чтобы просто не экспортировать этот конструктор и/или поле из модуля, например:

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, отображаются только экспортированные.