Haskell中的复杂数据结构 - 它们如何工作?

16 haskell immutability data-structures

正如我所知,Haskell中的变量是不可变的(因此,它们实际上不是"变量").

在这种情况下,如果我们有一个复杂的大数据结构,如红黑树,我们应该如何实现实际改变数据结构的操作?

每次插入或删除元素时都创建树的副本?

Lee*_*Lee 33

是的,解决方案是返回一个表示修改后的值的新数据结构,但是不需要复制示例的整个结构(红黑树),因为您只需将路径上的节点从根复制到插入的节点.这允许插入操作与命令式版本具有相同的复杂性.

Chris Okasaki的纯功能数据结构包含许多不可变数据结构的实现 - 这本书是他的博士论文的修改版本,你可以在这里找到

  • 超越冈崎的书:[自冈崎以来,纯功能数据结构有哪些新特点?](http://cstheory.stackexchange.com/questions/1539/whats-new-in-purely-functional-data-structures-since- okasaki) (6认同)

Sco*_*est 27

你对复制的直觉正是你应该思考的正确方向.但是,Haskell运行时智能地实现了"复制".例如,给定

data Tree = Empty | Branch Tree Integer Tree
Run Code Online (Sandbox Code Playgroud)

您可以实现一个函数来替换左分支:

replaceLeft :: Tree -> Tree -> Tree
replaceLeft (Branch _ i r) newLeft = Branch newLeft i r
Run Code Online (Sandbox Code Playgroud)

结果并不是您创建新树的完整副本,因为这不是必需的.价值i和树木r,并newLeft没有改变,所以我们没有自己的内容复制到记忆犹新.

Branch创建的新内容(这是此示例中唯一真正的分配:创建用于保存左/右树的结构Integer)仍引用旧分支中完全相同的值,无需复制!

由于数据结构是不可变的,因此这样做没有任何害处.

  • 我喜欢对不变性的关注:正是不变性才能让我们实现这种共享. (11认同)