Haskell 同一数据的多个查找结构:内存重复?
假设我有一群人的数据,我希望能够以不同的方式查找他们。也许有某种数据结构(如二叉树)便于按名称查找。也许还有另一个(像一张列表)是按创作顺序排列的。也许还有更多 在许多语言中,每个人在堆上只分配一次。每个数据结构都包含指向该内存的指针。因此,您并不是每次添加新的查找方法时都分配一组新的人员Haskell 同一数据的多个查找结构:内存重复?,haskell,Haskell,假设我有一群人的数据,我希望能够以不同的方式查找他们。也许有某种数据结构(如二叉树)便于按名称查找。也许还有另一个(像一张列表)是按创作顺序排列的。也许还有更多 在许多语言中,每个人在堆上只分配一次。每个数据结构都包含指向该内存的指针。因此,您并不是每次添加新的查找方法时都分配一组新的人员 在哈斯克尔怎么样?当不同的数据结构需要索引相同的数据时,有没有办法避免内存重复?我确信这个问题有更深入、更专业的答案,但目前 因为在纯函数式编程语言中,数据是不可变的,所以不需要做任何事情,只需要复制指针而不
在哈斯克尔怎么样?当不同的数据结构需要索引相同的数据时,有没有办法避免内存重复?我确信这个问题有更深入、更专业的答案,但目前 因为在纯函数式编程语言中,数据是不可变的,所以不需要做任何事情,只需要复制指针而不是复制它的目标 作为一个快速而肮脏的例子,我启动了ghci解释器:
Prelude> let x = replicate 10000 'm' in all (==x) $ replicate 10000 x
True
(1.61 secs, 0 bytes)
我承认这些统计数据是不可靠的,但它没有做的是为10000个字符长的列表的所有10000个副本分配内存
总结:
避免内存重复的方法是(a) 使用haskell
(b) 避免无意义地重建数据 如何无意义地重建数据? 一个非常简单且毫无意义的例子:
pointlessly_reconstruct_list :: [a] -> [a]
pointlessly_reconstruct_list [] = []
pointlessly_reconstruct_list (x:xs) = x:xs
这种情况会导致列表结构重复
你有没有一些没有意义但仍然简单的例子?
有趣的是,如果你做了
xs++ys
,你基本上重构了xs
,以便将ys
放在它的末尾(替换[]
),因此xs
的列表结构几乎被大量复制。但是,不需要复制实际数据,当然只需要一份ys
的副本。我真正的问题是:您如何意外复制记录?如果你使用相同的个人记录结构,那么每个映射都指向相同的内存。啊,那么这实际上回答了我的问题!我想知道情况是否如此。在其他语言中,如C,如果使用相同的值两次初始化结构,则使用的内存将是原来的两倍。但是,如果我理解正确的话,听起来Haskell会自动消除重复数据。@ThomasM.DuBuisson:很简单:假设您已经创建了所有数据和查找结构,那么您希望对其进行规范化。在多个查找表上执行与(fmap.fmap)toUpper
等效的操作,现在所有内容都被复制了。当然,您可以先进行规范化,但如果您不小心,这似乎是一个容易犯的错误。如果您执行xs++ys
,那么xs
的脊椎会被复制,而不是实际的列表元素本身。“没有必要复制实际数据。”-我应该说“没有必要复制xs
的实际数据,只是指针。”