请考虑以下数据模型:
data Artist = Artist Text
data Song = Song Artist Text
data Catalogue = Catalogue (Set Artist) (Set Song)
您可以看到s 和Artist
s 都引用了Song
s Catalogue
。Catalogue
包含从 s 引用的所有艺术家的列表,因此从两个地方引用Song
相同的值。Artist
Catalogue
假设我们要使用以下函数的多个应用程序来生成值:
insertSong :: Song -> Catalogue -> Catalogue
insertSong song@(Song artist title) (Catalogue artists songs) =
Catalogue (Set.insert artist artists) (Set.insert song songs)
很明显, s 将通过引用与s 所指Catalogue
的相同值来填充,从而通过不存储这些值的副本来节省内存。Artist
Song
问题是,当我尝试通过分别反序列化一组艺术家和一组歌曲来从序列化数据中重新创建目录时,应用程序占用的内存比它生成相同的Catalogue
with值时要多得多insertSong
。我怀疑这是由于s 和Artist
s 引用的相同 s 之间的关系丢失引起的,这就是为什么我得到占用额外内存的值的副本。Song
Catalogue
Artist
我看到的唯一解决方案是首先反序列化一组艺术家,然后反序列化一组歌曲,同时用Artist
第一组中的值强制替换 的值。
所以我的问题是:
- 我的怀疑是对的吗?
- 我看到的解决方案会起作用吗?
- 有没有更好的方法来解决这个问题?