Haskell中不再有状态单子版本的散列映射/集?

Haskell中不再有状态单子版本的散列映射/集?,haskell,hash,state-monad,Haskell,Hash,State Monad,哈希集和映射的一元接口在Haskell中消失了吗?在使用现代版本时,我应该考虑什么样的性能模型?(Data.Map、Data.HashMap、Data.HashSet)。在我的版本(ghc 7.0.2)中,它们似乎没有任何IO代码 哈希集和映射的一元接口在Haskell中消失了吗 不,还有一个一元哈希映射,它位于IOmonad中。(它不存在于STmonad中,这让人非常恼火,但我想这会使它的可移植性和易懂性稍差一些,因为ST不是Haskell 98。)它的工作原理与任何命令式语言中的哈希表非常相

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

哈希集和映射的一元接口在Haskell中消失了吗

不,还有一个一元哈希映射,它位于
IO
monad中。(它不存在于
ST
monad中,这让人非常恼火,但我想这会使它的可移植性和易懂性稍差一些,因为
ST
不是Haskell 98。)它的工作原理与任何命令式语言中的哈希表非常相似。性能特征也应该相同

当然,您可以从任何映射(包括哈希表)创建一个集合,方法是存储虚拟值(例如,只需将每个键映射到自身)

哈希集和映射的一元接口在Haskell中消失了吗

不,还有一个一元哈希映射,它位于
IO
monad中。(它不存在于
ST
monad中,这让人非常恼火,但我想这会使它的可移植性和易懂性稍差一些,因为
ST
不是Haskell 98。)它的工作原理与任何命令式语言中的哈希表非常相似。性能特征也应该相同


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

Data.HashMap和Data.HashSet使用Patricia树来存储哈希,因此操作的性能与Data.map具有相同的渐近复杂性。但也就是说,常量因子要小得多,而且根据我的经验,它们的执行速度要快得多。

仍然有可用的。然而,这一个已经被弃用(正是因为它不住在圣莫纳德),并将在GHC 7.8中删除

然而,有一个可用的一元哈希表,它位于圣路易斯。请参见hackageDB中的。

仍然有,可用。然而,这一个已经被弃用(正是因为它不住在圣莫纳德),并将在GHC 7.8中删除


然而,有一个可用的一元哈希表,它居住在ST.参见hackageDB中的。

对整个讨论的挑剔:将其称为“一元哈希图”是相当误导的,我对此感到困惑。我在期待一个
MonadHashTable
类或什么的。我称之为“不纯哈希表”,甚至是“在
IO
中进行操作的哈希表”。“monad”这个词不属于这里,我不明白为什么。如果有一堆函数在一个monad中返回值,那么调用“monadic”有什么错呢?我认为要调用“monadic”,这些函数应该返回任意monad的结果,或者至少是给定类型类中的任何monad。如果它们只返回
IO
中的值,那么
IO
是一个函子和一个类型构造函数以及一个单子;为什么不称之为“函数式”或“类型构造函数”?@Alexey I刚在谷歌上搜索过monadic。Hutton在一篇被广泛引用的论文中提到的术语“一元语法分析”不符合您对该词的限定定义。您会调用返回单元列表的函数吗?如果返回IO的函数被称为一元函数,那么返回列表的函数也应该被称为一元函数。在整个讨论中,吹毛求疵:将其称为“一元哈希映射”是相当误导的,我对此感到困惑。我在期待一个
MonadHashTable
类或什么的。我称之为“不纯哈希表”,甚至是“在
IO
中进行操作的哈希表”。“monad”这个词不属于这里,我不明白为什么。如果有一堆函数在一个monad中返回值,那么调用“monadic”有什么错呢?我认为要调用“monadic”,这些函数应该返回任意monad的结果,或者至少是给定类型类中的任何monad。如果它们只返回
IO
中的值,那么
IO
是一个函子和一个类型构造函数以及一个单子;为什么不称之为“函数式”或“类型构造函数”?@Alexey I刚在谷歌上搜索过monadic。Hutton在一篇被广泛引用的论文中提到的术语“一元语法分析”不符合您对该词的限定定义。您会调用返回单元列表的函数吗?如果返回IO的函数被称为monadic,那么返回列表的函数也应该是monadic。
> :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