Data structures 可变Haskell堆的类型签名
我想在Haskell中创建一个基于数组的可变堆(其他地方都可以找到的基本类型)。然而,对于我最初的方法,我有一些不喜欢的地方:Data structures 可变Haskell堆的类型签名,data-structures,haskell,monads,mutable,Data Structures,Haskell,Monads,Mutable,我想在Haskell中创建一个基于数组的可变堆(其他地方都可以找到的基本类型)。然而,对于我最初的方法,我有一些不喜欢的地方: 我使用元组来表示我的堆,而不是正确的数据类型 我不知道如何声明我正在使用的类型(周围有太多类型变量),依赖于类型推断(以及从Haskell Wiki复制示例) 我的堆不是多态的 在f示例函数中使用我的堆时,我必须遍历ns 将堆抽象为一个好的数据类型的最佳方法是什么?我觉得这将解决我的大多数问题 buildHeap max_n = do arr <-
- 我使用元组来表示我的堆,而不是正确的数据类型
- 我不知道如何声明我正在使用的类型(周围有太多类型变量),依赖于类型推断(以及从Haskell Wiki复制示例)
- 我的堆不是多态的
- 在
示例函数中使用我的堆时,我必须遍历f
sn
buildHeap max_n =
do
arr <- newArray (1, max_n) 0 :: ST s (STArray s Int Int)
return (0, arr)
-- My heap needs to know the array where the elements are stored
-- and how many elements it has
f n = --example use
do
(n1, arr) <- buildHeap n
(n2, _) <- addHeap (n1, arr) 1
(n3, _) <- addHeap (n2, arr) 2
getElems arr
main = print $ runST (f 3)
buildHeap max\n=
做
arr给初学者的一条一般性建议——从ioarray开始,而不是STArrays,这样你就不必担心更高级的类型和ST带来的其他技巧。然后,在你得到了你满意的东西之后,如果你愿意,你可以考虑如何将它移动到ST
除此之外,您还应该创建自己的ADT,而不是元组
data MutHeap a = MutHeap Int (IOArray Int a)
buildHeap max_n = do
arr <- newArray_ (1, max_n)
return (MutHeap 0 arr)
data mutsheap a=mutsheap Int(IOArray Int a)
buildHeap max\u n=do
arr您应该明确地将底层表示封装在抽象数据类型中,并且只提供用于构建和分解堆数据结构的智能构造函数
可变结构往往比不可变结构具有更简单的API(因为它们支持较少的良好行为)。要了解可变容器类型的合理API是什么样子,包括如何抽象表示,请参阅
特别是,
- ,这在元素中是多态的
及空气污染指数:
new :: JE a => IO (JudyL a)
-- Allocate a new empty JudyL array.
null :: JudyL a -> IO Bool
-- O(1), null. Is the map empty?
size :: JudyL a -> IO Int
-- O(1), size. The number of elements in the map.
lookup :: JE a => Key -> JudyL a -> IO (Maybe a)
-- Lookup a value associated with a key in the JudyL array.
insert :: JE a => Key -> a -> JudyL a -> IO ()
-- Insert a key and value pair into the JudyL array. Any existing key will be overwritten.
delete :: Key -> JudyL a -> IO ()
-- Delete the Index/Value pair from the JudyL array.
您将需要支持许多具有类似类型签名的相同操作
JudyL
的实际底层表示形式如下所示:
newtype JudyL a =
JudyL { unJudyL :: MVar (ForeignPtr JudyL_) }
type JudyL_ = Ptr JudyLArray
data JudyLArray
请注意,我们是如何通过锁定底层资源(在本例中是指向数据结构的C指针)来提供线程安全的。另外,表示是抽象的,用户看不见,保持了API的简单性