尝试替换地图中的元素,但不确定如何完成。不知道该怎么做才能访问键或值。
尝试了以下代码,但是它抱怨无法识别键或值。
let map : Map Text OneElement = M.fromList (("0001", OneElement "one" 1 )::("0002", OneElement "two" 2 )::("0003", OneElement "three" 3 )::("0004", OneElement "four" 4 ):: [])
let result = fmap(\i -> if i.key=="0001" then (OneElement "somethingelse" 1111) else i.value) map
还有如何在TextMap中访问键/值。
任何人都可以帮忙吗?谢谢。
答案 0 :(得分:3)
fmap
的{{1}}实现仅映射值,而不映射键值对:DA.Next.Map.Map
。您可以进行查找并替换以下值:
fmap : (v -> w) -> Map k v -> Map k w
请注意,我已经将您的import DA.Next.Map as M
data OneElement = OneElement with
t : Text
i : Int
deriving (Eq, Show)
mymap : Map Text OneElement = M.fromList [("0001", OneElement "one" 1), ("0002", OneElement "two" 2), ("0003", OneElement "three" 3), ("0004", OneElement "four" 4)]
result = fmap (\i -> if i == OneElement "one" 1 then OneElement "somethingelse" 1111 else i) mymap
重命名为map
,因为mymap
与标准库函数map
重叠。
如果您想使用类似地图的函数中的键值对,可以编写自己的地图函数:
map: (a -> b) -> [a] -> [b]
但是,您似乎要做的就是替换键import DA.Next.Map as M
data OneElement = OneElement with
t : Text
i : Int
deriving (Eq, Show)
mapEntries : MapKey k => ((k, v) -> w) -> Map k v -> Map k w
mapEntries f = M.fromList . map (\e -> (e._1, f e)) . M.toList
mymap : Map Text OneElement = M.fromList [("0001", OneElement "one" 1), ("0002", OneElement "two" 2), ("0003", OneElement "three" 3), ("0004", OneElement "four" 4)]
result = mapEntries (\(k, v) -> if k == "0001" then OneElement "somethingelse" 1111 else v) mymap
上的元素。为此,您在"0001"
中有insert
function。
DA.Next.Map