2

尝试替换地图中的元素,但不知道如何完成。不确定如何访问密钥或值。

尝试了以下代码,但它抱怨无法识别键或值。

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 中的键/值。

任何人都可以帮忙吗?谢谢。

4

1 回答 1

3

仅映射值,而不是键值对fmap的实现: . 您可以对值进行查找和替换,如下所示:DA.Next.Map.Mapfmap : (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

请注意,我已将您重命名mapmymap,因为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

但是,看起来您想要做的只是替换 key 处的元素"0001"。为此,您insert拥有.DA.Next.Map

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
于 2019-05-28T06:56:06.143 回答