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

struct MyData {
    char key1[20];
    long key2;
    ...  /* some data */
};


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

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

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

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

谢谢

最佳答案

在函数式编程中,这通常也不是问题。

data MyData = MyData
  { key1 :: ByteString
  , key2 :: Int
  , {- some data -} }


现在,我们可以使用HashMap ByteString MyData作为键来构建key1,或者使用Vector MyData作为索引来构建key2。仅指向键的指针将被复制,而不是记录甚至键本身。

关于haskell - 一种数据具有两种结构:函数式编程与命令式编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32836715/

10-10 01:03