我想做的是什么时候
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并不是很擅长,所以看看是否有人可以给我指点。
感谢。
编辑:更正了输出类型。我一开始输了错误。
答案 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"]
然而,现在有一个更深层次的问题。要弄清楚它是什么,让我们尝试将类型签名添加到rec1
和justfold
:
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
是个问题。要了解原因,请查看foldr
和singleton
的类型签名:
foldr :: (a -> b -> b) -> b -> [a] -> b
singleton :: k -> a -> Map k a
foldr
需要(a -> b -> b)
类型的函数,而singleton
不是那个函数,因为a
和Map 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
但是,根本问题在于,您无法在每次迭代时迭代更改类型的内容。如果您发现自己想要这样做,我建议您退后一步,重新考虑解决问题的方法。