read と show (それ自体は問題ではありません) を使用してシリアライゼーション/デシリアライゼーションを作成しようとしていますが、データ型を拡張できる (ただし縮小しない) という意味で拡張可能です。
このタイプがあるとします:
data Foo = { bar :: Int } deriving (Show, Read)
そしてリスト:
foos = [Foo 1, Foo 2]
簡単にファイルに逆シリアル化できます。
hPutStrLn fileHand . ppShow $ foos
次に、シリアル化して戻すことができます。
!str <- hGetContents fileHand
let foosFromFile = fromMaybe [] $ (readMaybe :: String -> Maybe [Foo]) str
しかし、数か月後、'baz' フィールドを Foo 型に追加したいとします。古い形式のファイルからの直接のシリアル化は、読み取りでは機能しなくなります。ファイルを変換する必要があります (これはあまり必要ありません)。
では、ファイルからデータをシリアル化し、不足しているフィールドにデフォルト値を入力するためのエレガントな (プログラム自体に明示的なバージョン管理ロジックを配置することなく) ソリューションはありますか? 多分いくつかのタイプのトリック?
ありがとう。