【问题标题】:How to access Map Key/value in DAML?如何访问 DAML 中的映射键/值?
【发布时间】:2019-05-28 00:55:30
【问题描述】:

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

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

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

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: dictionary daml


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 2016-09-15
      • 1970-01-01
      • 2019-12-06
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      相关资源
      最近更新 更多