Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 同一数据的多个查找结构:内存重复?_Haskell - Fatal编程技术网

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
的实际数据,只是指针。”