Haskell可变堆结构

时间:2011-06-03 05:17:13

标签: haskell functional-programming heap mutable

我想创建我的堆数据结构。此外,我想在多线程应用程序中使用它在STM monad中进行操作。堆的大小为1000万个元素。堆上有很多操作。

我看过这个包

  1. http://hackage.haskell.org/package/heap
  2. http://hackage.haskell.org/package/heaps
  3. 因为我的意思是他们都是持久的。如果我们修改这个数据结构,我们得到两个版本。 对于大尺寸的堆来说,它是内存无效的。

    因为我想我需要实现可变堆。

    我想听听你的意见和建议,以获得我想要的东西。

    感谢。

2 个答案:

答案 0 :(得分:2)

正如Ankur指出的那样,你可能超出了Haskell纯功能方面的界限。至少我从未见过具有良好内存性能的纯数据提取 - 数据结构 - 不要认为没有一个。您是否已对现有库进行了分析,以确保它们不足以满足您的需求? (请记住,持久性数据结构意味着每当发生变异时都会复制整个数据结构,不同“版本”之间可能存在批次共享。

然而,Haskell也有一个必要的方面,你可以在那一侧实现堆。命令式Haskell的性能特征与任何其他命令式语言的性能特征接近,因此您可能希望将堆基于某种类型的可变数组。

以与STM很好地协作的方式实现它可能会很棘手,STM的核心概念是TVar。你可以将它基于一个(甚至是不可变的)TVar数组,但由于每个操作都会触及堆的根,因此会有很多争用,STM开销会伤害你。我更倾向于使用locks / MVars一次将对堆的访问序列化为一个线程。

我知道Data.Vector.Mutable是一个流行的可变数组库。其他人会比我更为明智地推荐一个好的可变数组库用于你的目的。

答案 1 :(得分:0)

当你开始考虑“可变内存区域”和“修改这个内存区域的操作”时,你就会走出像Haskell这样的纯FP语言的界限,而这些边界将会超出这个边界。像Monads这样的haskell中的一些特殊技术。在您的Mutable数据结构的情况下,您正跨越基本边界,我不确定即使Monad可以帮助您跨越(Monad可以帮助您模拟它像一个可变数据结构ex:state monad - 但不会您正在寻找的是什么,因为您希望它是“可变的”,而不仅仅是模拟。