Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初等可变Haskell哈希表_Haskell - Fatal编程技术网

初等可变Haskell哈希表

初等可变Haskell哈希表,haskell,Haskell,尝试一个简单的哈希表,似乎对我使用Data.HashMap很有效。我希望更好地理解如何实现可变哈希表这是Data.HashTable.IO吗?这将允许更快的性能。我完全迷路了…试图修改示例,但无法找到我的方式通过IO类型,我得到了回报双关语的意图…提前感谢任何类型的步行通过或参考一个 例如,如何使用可变哈希表实现这个简单的练习 import qualified Data.HashMap as HM (toList,lookup,insert,empty) f list = g list HM.

尝试一个简单的哈希表,似乎对我使用Data.HashMap很有效。我希望更好地理解如何实现可变哈希表这是Data.HashTable.IO吗?这将允许更快的性能。我完全迷路了…试图修改示例,但无法找到我的方式通过IO类型,我得到了回报双关语的意图…提前感谢任何类型的步行通过或参考一个

例如,如何使用可变哈希表实现这个简单的练习

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是的,我知道,不知道那条斜线是怎么爬进去的,呵呵