fmap 的实现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] 重叠。
如果您想在类似 map 的函数中使用键值对,您可以编写自己的 map 函数:
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" 处的元素。为此,您在DA.Next.Map 中有insert function。
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 = insert "0001" (OneElement "somethingelse" 1111) mymap