微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在daml合约地图值中使用merge?

如何解决如何在daml合约地图值中使用merge?

MapKey k => (k -> a -> Optional c) -> (k -> b -> Optional c) -> (k -> a -> b -> Optional c) -> Map k a -> Map k b -> Map k c

难以理解语法,请提供示例以声明此合并以获取地图值,并简要说明如何使用简单示例构造它

解决方法

如果您有两个具有相同键类型的地图

m1 : Map k a
m2 : Map k b

您可以将它们合并为一个单独的地图Map k c,这样调用merge

merge f1 f2 f12 m1 m2

其中

  • f1 : k -> a -> Optional c指定在m1中找到密钥但在m2中找不到密钥时该怎么做。在这里f1传递了密钥及其在m1中的对应值。
  • f2 : k -> b -> Optional c指定在m2中找到密钥但在m1中找不到密钥时该怎么做。在这里f2传递了密钥及其在m2中的对应值。
  • f12 : k -> a -> b -> Optional c指定如果在m1m2中都找到了密钥,该怎么办。在这里f12传递了密钥,在m1中对应的值以及在m2中对应的值。

在每种情况下,如果您希望键在结果图中丢失,则返回None。如果您希望密钥出现并与值Some x相关联,请返回x

,

确保您已阅读该功能的docs

merge具有三个功能和两个映射。这两个映射具有相同的键类型,但具有不同的值类型。当然,地图生成的表单merge必须具有单个值类型,因此我们必须告诉merge如果...怎么办

  1. 仅在第一个提供的地图中存在一个值
  2. 仅存在提供第二张地图的值
  3. 两个值都存在

例如,假设我们有一个地图Map Int Text和一个地图Map Int Bool要合并,而我们只说生成的地图应指出我们在上述三种情况中的哪一种。我们可以为此定义一个类型

data EitherOrBoth a b
  = EOBLeft a
  | EOBRight b
  | EOBBoth (a,b)
    deriving (Eq,Show)

现在,我们可以定义函数,使其在合并中说“在Le​​ft中粘贴一个值”,“在Right中粘贴一个值”和“在一个元组中粘贴两个值”:

mergeWithBoth : (MapKey k) => Map k a -> Map k b -> Map k (EitherOrBoth a b)
mergeWithBoth = merge (\k x -> Some (EOBLeft x)) (\k y -> Some (EOBRight y)) (\k x y -> Some (EOBBoth (x,y)))

使用脚本尝试全部操作:

import Daml.Script
import DA.Next.Map (Map,MapKey,merge,fromList)

data EitherOrBoth a b
  = EOBLeft a
  | EOBRight b
  | EOBBoth (a,Show)

mergeWithBoth : (MapKey k) => Map k a -> Map k b -> Map k (EitherOrBoth a b)
mergeWithBoth = merge (\k x -> Some (EOBLeft x)) (\k y -> Some (EOBRight y)) (\k x y -> Some (EOBBoth (x,y)))

testMerge = script do
  let
    mapIntText : Map Int Text = fromList[(1,"Hello"),(2,"World")]
    mapIntDec : Map Int Bool  = fromList[(2,True),(3,False)]

  assert (mergeWithBoth mapIntText mapIntDec
    == fromList [(1,EOBLeft "Hello"),EOBBoth ("World",True)),EOBRight False)])
  
  return (mergeWithBoth mapIntText mapIntDec)    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?