この場合、本当にインスタンスが必要かどうかはわかりませんShow
。ドキュメントから。
Showの派生インスタンスには、Readの派生インスタンスと互換性のある次のプロパティがあります。
- showの結果は、型が宣言された時点で有効な固定宣言が与えられた場合、定数のみを含む構文的に正しいHaskell式になります。これには、データ型、括弧、およびスペースで定義されたコンストラクター名のみが含まれます。ラベル付きコンストラクターフィールドが使用される場合、中括弧、コンマ、フィールド名、および等号も使用されます。
これには、派生インスタンスにのみ適用されるという警告がありますが、私はコントラクトの執着者であり、read . show
事実上ノーオペレーションであると想定することに慣れています。もちろん、インスタンスを自動的に派生させようとすると、この同じ問題が再び発生するため、今Read
を使用してセマンティックエラーを導入するShow
のではなく、好みの問題です。
コンテキストによっては(大げさな推測をして、どこかに中間値を出力してデバッグしようとしていますか?)、別の型クラスを定義して-liketoString
関数を実装すると、インスタンスの機能について誤解を招く可能性がなく、最適にshow
機能する場合があります。例えば、
class ToString a where
toString :: a -> String
instance ToString Client where
toString c = "Client {"
++ shows (clientId c) ", "
++ shows (nickname c) ", "
++ shows (isJust (clientSink c)) ", "
++ show (clientRoom c)
++ "}"
そして、これをShow
インスタンスに変換したい場合は、次のように簡単です。
instance Show Client where
show = toString