纯功能套装

时间:2012-05-15 01:30:50

标签: algorithm data-structures functional-programming set referential-transparency

是否存在实现纯函数集的算法?

预期的操作是 union 交集差异元素?空?< / em>和 adjoin

这些并不是硬性要求,我很乐意学习一种只实现其子集的算法。

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

几乎所有数据结构都存在纯粹的功能实现。在集合或地图的情况下,您通常使用某种形式的搜索树,例如红/黑树或AVL树。功能数据结构的标准参考是Okasaki的书:

http://www.cambridge.org/gb/knowledge/isbn/item1161740/

它的重要部分可以通过他的论文免费获得:

http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf

答案 2 :(得分:1)

@ninjagecko回答的链接很好。我最近关注的是Clojure中使用的持久数据结构,它是功能性的,不可变的和持久的。

持久性哈希映射的实现描述可以在这篇由两部分组成的博客文章中找到:

http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/

http://blog.higher-order.net/2010/08/16/assoc-and-clojures-persistenthashmap-part-ii/

这些是this reference request question中的一些想法(参见第一个答案,第一个条目)的实现。

这些结构中出现的集合支持您需要的功能:

http://clojure.org/data_structures#Data Structures-Sets

剩下的就是browse the source code and try to wrap your head around it

答案 3 :(得分:1)

Here is在OCaml中实现纯功能集(它是OCaml的标准库)。

答案 4 :(得分:1)

  

是否存在实现纯函数集的算法?

您可以使用许多不同的纯功能数据结构来实现集合操作。有些人比其他人有更好的复杂性。

示例包括:

<强> Lists

我们在哪里:

List Difference:

(\\) :: Eq a => [a] -> [a] -> [a]

\\函数是列表差异((非关联)。在xs \\ ys的结果中,ys的每个元素的第一次出现(如果有的话)已从xs中删除。因此

union :: Eq a => [a] -> [a] -> [a]

union函数返回两个列表的列表并集。例如,

"dog" `union` "cow" == "dogcw"

第一个列表的副本和元素将从第二个列表中删除,但如果第一个列表包含重复项,则结果也是如此。这是unionBy的一个特例,它允许程序员提供自己的相等测试。

intersect :: Eq a => [a] -> [a] -> [a]

交叉函数采用两个列表的列表交集。例如,

[1,2,3,4] `intersect` [2,4,6,8] == [2,4]

如果第一个列表包含重复项,那么结果也是如此。

不可变集

可以设计更高效的数据结构来提高集合操作的复杂性。例如,Haskell中的标准Data.Set库将集合实现为大小平衡的二叉树:

这是什么数据结构:

data Set a    = Bin !Size !a !(Set a) !(Set a)
              | Tip

type Size     = Int

产生复杂性:

  • union,intersection,difference: O(n + m)