一种具有两种结构的数据:功能编程与命令编程

Yan*_*Zhu 2 haskell functional-programming data-structures

假设在C中,我们有以下结构:

struct MyData {
    char key1[20];
    long key2;
    ...  /* some data */
};
Run Code Online (Sandbox Code Playgroud)

基本上,除了一些数据,我们有两个键:key1和key2.假设我们需要以两种不同的方式管理MyData的一堆对象,例如,基于key1或key2(但不是两者)快速查找相应的对象.满足此要求的一种方法是分别根据这两个密钥构建两个不同的RB树(或散列表).在C/C++中,数据不需要重复,因为我们只需要记录对象的指针.

在上面的假设示例中,关键点在于我们有一堆相同类型的数据,我们可以通过两种不同的数据结构组织它,而不用命令式语言复制数据.我想知道纯函数式编程如何在不重复数据的情况下有效地满足这一要求.为了使其更具普遍性或挑战性,两种数据结构可能不是同一类型.例如,一个可以是rb-tree而另一个可以是hash-table.

如果可能,请在Haskell中布局您的解决方案.

PS:作为函数式编程的新手,我不禁想知道如何在纯函数式编程中从命令式编程中获得一些技巧.我知道有时根本没有意义.如果有人觉得这个问题也没有意义,请详细说明.

谢谢

dfe*_*uer 7

这通常也不是函数式编程中的问题.

data MyData = MyData
  { key1 :: ByteString
  , key2 :: Int
  , {- some data -} }
Run Code Online (Sandbox Code Playgroud)

现在我们可以构建一个HashMap ByteString MyData,使用key1作为键,或Vector MyData使用key2作为索引,或其他什么.只有指向键的指针才会重复,而不是记录甚至键本身.

  • @YanZhu,没有.但是如果你已经计算了一些东西,并且你将它粘贴在几个不同的数据结构中,那么它们中的每一个(通常)只保存一个指向它的指针. (4认同)
  • @YanZhu一般来说,没有做到,没有.然而,与可变性是常态并且复制是唯一安全的事情的语言不同,在Haskell中几乎没有操作创建一个数据的副本(毕竟不能改变!). (4认同)