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'

に修正lastnameするlastNameことで、エラーを削除しました。

質問:

エラー メッセージの単語(visible)は、フィールドを非表示/非表示として宣言する可能性があることを示唆しています。これは正しいですか?そうである場合、コンストラクターでフィールドを非表示として宣言するにはどうすればよいですか?また、非表示フィールドを宣言する必要がある一般的なシナリオは何ですか? それらの使用の簡単な例を挙げてこれを説明できれば幸いです。

注: 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引き続き両方のコンストラクターと 4 つのフィールドすべてにアクセスできますが、インポートする他のモジュールではMyModule、エクスポートされたものだけが表示されることに注意してください。

于 2012-07-23T06:59:30.963 に答える