Data structures 某些数据结构是否比其他数据结构更适合函数式编程?

Data structures 某些数据结构是否比其他数据结构更适合函数式编程?,data-structures,functional-programming,immutability,Data Structures,Functional Programming,Immutability,在中,有一个标题为“没有数组或哈希表的生活”的部分,作者建议在函数式编程中优先使用列表和树,而在命令式程序中可以使用数组或哈希表 这是有意义的,因为在创建新列表或树时重用(不可变)列表或树的一部分比使用数组要容易得多 因此,我的问题是: 在函数式编程和命令式编程之间,数据结构的使用模式是否真的存在显著差异 如果是,这是一个问题吗 如果您确实需要某个应用程序的哈希表,该怎么办?你会简单地承担修改所产生的额外费用吗 函数式程序倾向于更加强调递归。这反过来又建议使用递归算法和递归数据结构。列表和树都

在中,有一个标题为“没有数组或哈希表的生活”的部分,作者建议在函数式编程中优先使用列表和树,而在命令式程序中可以使用数组或哈希表

这是有意义的,因为在创建新列表或树时重用(不可变)列表或树的一部分比使用数组要容易得多

因此,我的问题是:

  • 在函数式编程和命令式编程之间,数据结构的使用模式是否真的存在显著差异
  • 如果是,这是一个问题吗
  • 如果您确实需要某个应用程序的哈希表,该怎么办?你会简单地承担修改所产生的额外费用吗

函数式程序倾向于更加强调递归。这反过来又建议使用递归算法和递归数据结构。列表和树都是递归结构(列表上的“下一个”链接是另一个列表,树节点的子节点都是树)


如果你想在一个算法上花费额外的费用,你可能需要重新考虑。为什么哈希表(对于非递归算法是O(1))会产生额外的开销?与树或列表相比,使用它有什么好处?

是的,主要区别是数据的不可变性,其中可能包括代码(请参见高阶函数)。有关常用数据类型和用法的列表,请参见上的Wikipedia页面。这是否是一个问题取决于你如何看待它。如果函数式语言适合您正在处理的任务类型,那么它有许多优点。哈希表是一种关联数组,但它不是函数式语言中要使用的数组,因为在插入时必须进行重新灰化,而且没有数组时性能很差。相反,请尝试使用关联数组。

  • 对。通常,元组、列表和部分求值函数是函数式编程语言中非常常见的数据结构。可变数据结构,如数组和(实)哈希表,使用较少,因为它们不适合Haskell。SML(也是功能性的,但不是惰性的)可以比Haskell更自然地使用数组,但列表仍然更常见,因为它们可以很好地映射到递归算法
  • 我不知道怎么回答这个问题。谁的问题
  • 存在关联数组(“哈希表”等价物)的实现,即使在不同的更新之后,它们也可以继续共享它们的大部分底层结构。我相信GHC的
    Data.Map
    ;此外,它还有许多惰性/功能友好的数据结构
这本书深入地介绍了您的问题,并包含了大量的理论和实现,主要是在ML中-附录中还包含Haskell实现,因此您应该能够进行一些额外的翻页。如果你真的对问题的彻底答案感兴趣的话,这是一本相当不错的书(尽管有些部分很难)。话虽如此,我认为伊弗米特给出了一个极好的简短回答

编辑:史蒂文·赫维格为这本书开始时的论文提供了一个参考。虽然我还没有读过,但唯一遗漏的(从目录中判断)是Haskell的实现。

Chris Okasaki的论文可以在网上免费获得。它涵盖了不可变持久数据表示的许多不同策略

至于真正需要一个哈希表,当你搜索二十个元素时,O(LG n)查找只比O(1)查找慢了一百万倍。

  • 数据的使用模式真的有很大不同吗 功能与功能之间的结构 命令式编程
大的,巨大的,日夜不停的——主要是因为在函数式编程中不能容忍副作用

  • 如果是,这是一个问题吗
问题在于,随着并行化变得越来越必要,命令式范例将无法保持效率-这些语言的唯一出路是消除副作用,但随后它们将成为破损的函数式语言-但是,既然有一些非常好的,工作函数语言。此外,函数语言的语义更易于控制,因此,功能程序可以被证明是正确的,而它们的C++同行却不能(无论如何,)。因此,许多正式的验证工具都基于函数式语言——例如,ACL2基于common lisp,Cryptol基于Haskell。由于形式验证是未来的潮流,函数式语言可以更好地与这些工具集成。简而言之,对C、C++和这样好的证据说再见!很久以前就应该有人给他们拿30块钱

  • 如果您确实需要某个应用程序的哈希表,该怎么办?你…吗 把额外的费用吞下去 修改的费用
未来的潮流是:用 指定哈希表-使用的语言是cryptol。当你 完成并已证明您的程序可以运行您按下按钮并弹出 一个高效的版本,如果已经决定使用哈希表
最好用的东西

是的,使用模式有很大的不同,但这不是问题。如果您想要一个哈希表,通常意味着您想要一个具有字符串键和快速访问的有限映射。Bentley和Sedgewick的是纯功能的,至少在某些情况下,它们的性能优于哈希表


如上所述,Chris Okasaki关于纯功能数据结构的书非常好。

作为一个多年从事OO的人,最近正在构建一个需要大量速度(实时)的大型项目