Haskell中的嵌套映射

时间:2013-04-17 21:27:21

标签: haskell hashmap nested

我想做的是什么时候

rec1 = [("name", "obj-1"), ("status", "up"), ("region", "us")]

然后我想

[( "us", [("up", [("name", "obj-1"), ("status", "up"), ("region", "us")])])] 

这是我在Haskell中提出的代码。

rec1 = [("name", "obj-1"), ("status", "up"), ("region", "us")] 
convertto rec = Prelude.foldl (\map (k, v) -> Data.Map.insert k v map) Data.Map.empty rec 
justfold = Prelude.foldr (\key val -> Data.Map.insert key val Data.Map.empty) (convertto rec1) ["us","up"] 

在上面的第三行中,在我的lambda函数定义中,编译器不同意val的类型。它说它期望一个Char并且正在获得一个String或者不能将Map String与列表类型匹配。

我对Haskell并不是很擅长,所以看看是否有人可以给我指点。

感谢。

编辑:更正了输出类型。我一开始输了错误。

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,一些很容易,一些很难。我们先来看看容易的事情:

第一个是你的convertto功能。它已经存在,被称为fromList。还有一个函数可以创建一个新的Map,其中包含一对,称为singleton。你在Data.Map中提到函数的方式也很不寻常。解决这些问题给出了:

import qualified Data.Map as M

rec1 = M.fromList [("name", "obj-1"), ("status", "up"), ("region", "us")] 
justfold = foldr M.singleton rec1 ["us","up"]

然而,现在有一个更深层次的问题。要弄清楚它是什么,让我们尝试将类型签名添加到rec1justfold

import qualified Data.Map as M

rec1 :: M.Map [Char] [Char]
rec1 = M.fromList [("name", "obj-1"), ("status", "up"), ("region", "us")] 

justfold :: M.Map [Char] (M.Map [Char] (M.Map [Char] [Char]))
justfold = foldr M.singleton rec1 ["us","up"]

rec1很好,但justfold是个问题。要了解原因,请查看foldrsingleton的类型签名:

foldr :: (a -> b -> b) -> b -> [a] -> b

singleton :: k -> a -> Map k a

foldr需要(a -> b -> b)类型的函数,而singleton不是那个函数,因为aMap k a不是同一个东西。以下代码生成您想要的结果:

import qualified Data.Map as M

rec1 = M.fromList [("name", "obj-1"), ("status", "up"), ("region", "us")] 
justfold = M.singleton "us" $ M.singleton "up" rec1

但是,根本问题在于,您无法在每次迭代时迭代更改类型的内容。如果您发现自己想要这样做,我建议您退后一步,重新考虑解决问题的方法。