初等可变Haskell哈希表
尝试一个简单的哈希表,似乎对我使用Data.HashMap很有效。我希望更好地理解如何实现可变哈希表这是Data.HashTable.IO吗?这将允许更快的性能。我完全迷路了…试图修改示例,但无法找到我的方式通过IO类型,我得到了回报双关语的意图…提前感谢任何类型的步行通过或参考一个 例如,如何使用可变哈希表实现这个简单的练习初等可变Haskell哈希表,haskell,Haskell,尝试一个简单的哈希表,似乎对我使用Data.HashMap很有效。我希望更好地理解如何实现可变哈希表这是Data.HashTable.IO吗?这将允许更快的性能。我完全迷路了…试图修改示例,但无法找到我的方式通过IO类型,我得到了回报双关语的意图…提前感谢任何类型的步行通过或参考一个 例如,如何使用可变哈希表实现这个简单的练习 import qualified Data.HashMap as HM (toList,lookup,insert,empty) f list = g list HM.
import qualified Data.HashMap as HM (toList,lookup,insert,empty)
f list = g list HM.empty where
g [] h = HM.toList h
g (x:xs) h = case HM.lookup (x-1) h of
Just _ -> g xs (HM.insert x (x + 1) h)
Nothing -> g xs (HM.insert x x h)
HM.insert的类型签名为
insert::IOHashTable h k v->k->v->IO
从这个签名中,我们可以看到insert并没有返回插入元素的新hashmap,它实际上是一个IO操作,为我们执行插入操作,对旧hashmap进行适当的修改
类似地,HM.lookup也会在IO monad中返回其结果:
lookup::IOHashTable hkv->k->iov
因此,我们需要做一些工作来绑定这些函数返回的IO操作。我想你想要这样的东西
f xs = g xs HM.empty
where g [] h = HM.toList h
g (x:xs) h = do
res <- HM.lookup (x-1) h
case res of
Nothing -> HM.insert h x x
Just _ -> HM.insert h x (x+1)
g xs h
HM.insert的类型签名为
insert::IOHashTable h k v->k->v->IO
从这个签名中,我们可以看到insert并没有返回插入元素的新hashmap,它实际上是一个IO操作,为我们执行插入操作,对旧hashmap进行适当的修改
类似地,HM.lookup也会在IO monad中返回其结果:
lookup::IOHashTable hkv->k->iov
因此,我们需要做一些工作来绑定这些函数返回的IO操作。我想你想要这样的东西
f xs = g xs HM.empty
where g [] h = HM.toList h
g (x:xs) h = do
res <- HM.lookup (x-1) h
case res of
Nothing -> HM.insert h x x
Just _ -> HM.insert h x (x+1)
g xs h
谢谢这让我通过了案例/查找障碍…不过,似乎还有一些事情需要解决,比如新的而不是空的…以及如何显示IO类型,比如IO[k0,v0],这是toList的结果?如果你有一个x::IO a,你可以使用x>>=print来显示it@groovy顺便说一句,这只是说\list@JustinL的一种更具表现力的方式。你的意思是做{a@ChrisDueck是的,我做了,不知道那条斜线是怎么爬进去的hehThanks!这让我通过了案例/查找障碍…不过似乎还有一些事情要做,比如新的而不是空的…以及如何显示IO类型,比如IO[k0,v0],这是toList的结果?如果您有一个x::IO a,您可以使用x>>=print来显示it@groovy顺便说一句,这仅仅是一种更具表现力的方式来说\list@JustinL。你的意思是{a@ChrisDueck是的,我知道,不知道那条斜线是怎么爬进去的,呵呵