假设在C中,我们有以下结构:
struct MyData {
char key1[20];
long key2;
... /* some data */
};
基本上,除了一些数据,我们还有两个键:key1和key2。假设我们需要以两种不同的方式管理 MyData 的一堆对象,例如,基于key1或key2(但不是两者)快速查找相应的对象。满足此要求的一种方法是分别根据这两个密钥构建两个不同的RB树(或散列表)。在C / C ++中,数据不需要重复,因为我们只需要记录对象的指针。
在上面的假设示例中,关键点是我们有一堆相同类型的数据,我们可以通过两种不同的数据结构组织它,而不必用命令式语言复制数据。我想知道纯函数式编程如何在不重复数据的情况下有效地满足这一要求。为了使其更具普遍性或挑战性,两种数据结构可能不是同一类型。例如,一个可以是rb-tree而另一个可以是hash-table。
如果可能,请在Haskell中布局您的解决方案。
PS:作为函数式编程的新手,我无法想知道如何在纯函数式编程中从命令式编程中获得一些技巧。我知道有时它根本没有意义。如果有人觉得这个问题也没有意义,请详细说明。谢谢
答案 0 :(得分:7)
这在函数式编程中通常也不是问题。
data MyData = MyData
{ key1 :: ByteString
, key2 :: Int
, {- some data -} }
现在,我们可以使用HashMap ByteString MyData
作为密钥构建key1
,或使用Vector MyData
作为索引构建key2
,或者其他任何内容。只有指向键的指针才会重复,而不是记录甚至键本身。
答案 1 :(得分:4)
Haskell或任何其他语言(命令性或功能性)没有理由默认情况下不存储对不可变对象(特别是那些大于指针的对象)的引用/指针,除非出于特定的优化原因,例如内存布局或当功能代码被例如重写时引擎盖下的编译器性能更高。
换句话说,没有理由不假设Haskell(或任何其他现代语言)按预期和C一样有效地处理它。