在Haskell中没有更多状态monad版本的哈希映射/集合?

gat*_*ado 1 hash haskell state-monad

散列集和映射的monadic接口是否在Haskell中消失了?在使用现代版本时,我应该考虑什么样的性能模型?(Data.Map,Data.HashMap,Data.HashSet).它们在我的版本中似乎没有任何IO代码(ghc 7.0.2),

> :browse Data.HashSet
type HashSet a = Set a
newtype Set a
  = Data.HashSet.Set (Data.IntMap.IntMap (Data.HashSet.Some a))
(\\) :: Ord a => Set a -> Set a -> Set a
delete :: (Data.Hashable.Hashable a, Ord a) => a -> Set a -> Set a
difference :: Ord a => Set a -> Set a -> Set a
elems :: Set a -> [a]
empty :: Set a
Data.HashSet.filter :: Ord a => (a -> Bool) -> Set a -> Set a
fold :: (a -> b -> b) -> b -> Set a -> b
fromList :: (Data.Hashable.Hashable a, Ord a) => [a] -> Set a
insert :: (Data.Hashable.Hashable a, Ord a) => a -> Set a -> Set a
intersection :: Ord a => Set a -> Set a -> Set a
isProperSubsetOf :: Ord a => Set a -> Set a -> Bool
isSubsetOf :: Ord a => Set a -> Set a -> Bool
Data.HashSet.map ::
  (Data.Hashable.Hashable b, Ord b) => (a -> b) -> Set a -> Set b
member :: (Data.Hashable.Hashable a, Ord a) => a -> Set a -> Bool
notMember ::
  (Data.Hashable.Hashable a, Ord a) => a -> Set a -> Bool
Data.HashSet.null :: Set a -> Bool
partition :: Ord a => (a -> Bool) -> Set a -> (Set a, Set a)
singleton :: Data.Hashable.Hashable a => a -> Set a
size :: Set a -> Int
toList :: Set a -> [a]
union :: Ord a => Set a -> Set a -> Set a
unions :: Ord a => [Set a] -> Set a
Run Code Online (Sandbox Code Playgroud)

aug*_*tss 7

Data.HashMap和Data.HashSet使用Patricia树来存储哈希值,因此操作的性能与Data.Map具有相同的渐近复杂度.但话虽如此,常数因素要小得多,而且我的经验表现得相当快.


Rob*_*een 5

散列集和映射的monadic接口是否在Haskell中消失了?

不,还有一个monadic哈希映射Data.HashTable,它存在于IOmonad中.(它非常令人讨厌,因为它不会存在于STmonad中,但这会使它稍微不那么便携,而且我认为它不太容易理解,因为ST它不是Haskell 98.)它的工作方式非常类似于任何命令式语言的哈希表.性能特征也应该相同.

当然,从任何地图(包括哈希表)中,您都可以通过存储虚拟值来创建一个集合(例如,只需将每个键映射到自身).

  • 我认为调用"monadic"这些函数应该在_arbitrary_ monad中返回结果,或者至少在给定类型类中返回任何monad.如果它们只返回"IO"中的值,那么......"IO"是一个仿函数和一个类型构造函数以及一个monad; 为什么不把它称为"functorial"或"type constructoric"? (7认同)
  • Nitpick在整个讨论中:将其称为"monadic哈希图"是相当误导的,我对此感到困惑.我期待着一个"MonadHashTable"课程.我称之为"不纯的哈希表",甚至称为"具有"IO`操作的哈希表"."monad"这个词并不属于这里. (6认同)
  • @Alexey我只是用Google搜索monadic.术语"monadic parsing"的使用,包括Hutton引用的一篇论文,不符合你对该词的限制性定义. (3认同)
  • 你会调用返回列表monadic的函数吗?如果返回IO的函数被称为monadic,则返回列表的函数也应如此. (3认同)