如何在 Dhall 中将动态命名记录与静态记录合并?

2024-01-13

我正在 Dhall 中创建 AWS Step Function 定义。但是,我不知道如何创建他们使用的通用结构Choice如下例所示:

{
    "Not": {
        "Variable": "$.type",
        "StringEquals": "Private"
    },
    "Next": "Public"
}

The Not使用起来非常简单mapKey and mapValue。如果我定义一个基本比较:

{ Type =
    { Variable : Text
    , StringEquals : Optional Text
    }
, default = 
    { Variable = "foo" 
    , StringEquals = None Text
    }
}

以及类型:

let ComparisonType = < And | Or | Not >

并添加一个辅助函数来将类型呈现为Text为了mapKey:

let renderComparisonType = \(comparisonType : ComparisonType )
    -> merge
    { And = "And"
    , Or = "Or"
    , Not = "Not"
    }
    comparisonType

然后我可以在函数中使用它们来中途生成记录:

let renderRuleComparisons = 
  \( comparisonType : ComparisonType ) ->
  \( comparisons : List ComparisonOperator.Type ) ->
    let keyName = renderComparisonType comparisonType
    let compare = [ { mapKey = keyName, mapValue = comparisons } ]
    in compare

如果我使用以下命令运行它:

let rando = ComparisonOperator::{ Variable = "$.name", StringEquals = Some "Cow" }
let comparisons = renderRuleComparisons ComparisonType.Not [ rando ]
in comparisons

Using dhall-to-json,她将输出第一部分:

{
    "Not": {
        "Variable": "$.name",
        "StringEquals": "Cow"
    }
}

...但我一直在努力将其与"Next": "Sup"。我已经使用了所有记录合并,例如/\, //等等,它不断给我带来各种我还没有真正理解的类型错误。


首先,我将采用一种不进行类型检查的方法作为激发解决方案的起点:

let rando = ComparisonOperator::{ Variable = "$.name", StringEquals = Some "Cow" }

let comparisons = renderRuleComparisons ComparisonType.Not [ rando ]

in  comparisons # toMap { Next = "Public" }

toMap是将记录转换为键值列表的关键字,并且#是列表串联运算符。这Dhall 备忘单 https://docs.dhall-lang.org/howtos/Cheatsheet.html有一些如何使用它们的示例。

上述解决方案不起作用,因为#无法合并具有不同元素类型的列表。的左侧#运算符有这种类型:

comparisons : List { mapKey : Text, mapValue : Comparison.Type }

...而右侧#运算符有这种类型:

toMap { Next = "Public" } : List { mapKey : Text, mapValue : Text }

……所以两个人List由于 s 的类型不同,因此无法按原样合并mapValue field.

有两种方法可以解决这个问题:

  • 方法 1:只要存在类型冲突,就使用 union
  • 方法 2:使用可以保存任意值的弱类型 JSON 表示形式

对于这个特定示例,方法 1 是更简单的解决方案,方法 2 是更通用的解决方案,可以处理非常奇怪的 JSON 模式。

对于方法 1,dhall-to-json转换为 JSON 时,将自动剥离非空联合构造函数(留下它们所包装的值)。这意味着您可以转换两个参数#运营商同意这种常见类型:

List { mapKey : Text, mapValue : < State : Text | Comparison : Comparison.Type > }

...然后您应该能够连接两个键值对列表并dhall-to-json将正确渲染它们。

还有第二种用于处理弱类型 JSON 模式的解决方案,您可以在此处了解更多信息:

  • Dhall 手册 - 如何将现有 YAML 配置文件转换为 Dhall https://github.com/Gabriel439/dhall-manual/blob/develop/manuscript/01-YamlToDhall.md

基本思想是,所有 JSON/YAML 集成都识别并支持弱类型 JSON 表示形式,该表示形式可以保存任意 JSON 数据,包括具有不同形状键的字典(如您的示例中所示)。您甚至不需要将整个表达式转换为这种弱类型表示;您只需将此表示形式用于遇到架构问题的配置子集。

对于您的示例来说,这意味着您可以将两个参数更改为#运算符具有这种类型:

let Prelude = https://prelude.dhall-lang.org/v12.0.0/package.dhall

in  List { mapKey : Text, mapValue : Prelude.JSON.Type }

The 的文档Prelude.JSON.Type https://github.com/dhall-lang/dhall-lang/blob/v12.0.0/Prelude/JSON/Type还有有关如何使用此类型的更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Dhall 中将动态命名记录与静态记录合并? 的相关文章

  • DbGeography 多边形到 JSON

    我将 DbGeography 多边形存储在数据库中 我的控制器从数据库获取多边形 我需要将它们转换为 JSON var polygons db Areas Where x gt x Type type Select x gt new Vie
  • 从 JSON 文件注入的编译指令 AngularJS

    希望有人能帮助我应对这一挑战 我使用以下命令从服务器请求 JSON 数据 http get 来自服务器的数据返回一个对象 对象中的一个值包含 HTML 标记 该标记使用以下方式注入到页面中 div div 在标记内 有一个名为的自定义指令
  • 用于检查 Apache Camel XML 中字符串的 JSONPath 表达式

    假设我有一个简单的 json 文件 如下所示 log host blah severity INFO system 1 我正在使用 Apache Camel 它是 Spring XML 来处理和路由 json 文件 我的路由代码看起来像这样
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 将 JSON 反序列化为表

    我需要根据通过 API 接收的数据填充 ABAP 中的表 我正在使用以下 ABAP 函数从 json 填充现有的 ABAP 表 JSON 是正确的 表中包含相应的表 ui2 cl json gt deserialize EXPORTING
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • JSON-LD 缺少“}”或对象成员名称。错误

    我喜欢将 json ld 添加到我的网站 然后我想将它添加到我的开发网站来测试它 我收到错误消息 指出缺少 或对象成员名称 这是什么错误 我已正确关闭括号 如何修复它
  • Flutter:将字符串转换为 Map

    我正在使用 SQFlite 在本地存储数据 我有一个表 其中有一个名为 json 的字段 该字段的类型为 TEXT 并存储转换为字符串的 json 例如 name Eduardo Age 23 性别男 到目前为止 一切正常 但随后我需要从数
  • 如何发送和接收大型 JSON 数据

    我对全栈开发比较陌生 目前正在尝试找出一种有效的方法send and fetch我的前端 React 和后端 Express 之间存在大量数据 同时最大限度地减少内存使用 具体来说 我正在构建一个地图应用程序 它需要我处理大型 JSON 文
  • 在 Node.js 中解析 Json(带有数组和对象)并将数据导出到 Excel 文件中

    我是 Node js 新手 我的要求是 我需要解析 JSON 并将数据导出到 Excel 文件中 其中包含 JSON 中的所有字段 我的 JSON 如下 id 1255 title The Brain and Nervous System
  • 如何在 pandas 中读取并标准化以下 json?

    我在 stackoverflow 中使用 pandas 看到了很多 json 读取问题 但我仍然无法解决这个简单的问题 Data session id 0 X061RFWB06K9V 1 5AZ2X2A9BHH5U unix timesta
  • 根据 .NET Core 2.1 中的更改重新加载 Serilog JSON 配置

    我目前正在开发 ASP NET Core 2 1 应用程序 并使用 Serilog 进行日志记录 我想在运行时为我的 Serilog 实现重新加载应用程序设置文件 我的目标是在运行时更改日志级别 例如我写入minimumLevelDebug
  • 将嵌套字典键值转换为 pyspark 数据帧

    我有一个 Pyspark 数据框 如下所示 我想提取 dic 列中的那些嵌套字典并将它们转换为 PySpark 数据帧 像这样 请让我知道如何实现这一目标 Thanks from pyspark sql import functions a
  • 如何将我的 json 字符串 avro 二进制编码为字节数组?

    我有一个实际的 JSON 字符串 我需要将其 avro 二进制编码为字节数组 在经历了Apache Avro 规范 http avro apache org docs 1 7 7 spec html 我想出了下面的代码 我不确定这是否是正确
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 使用 Newtonsoft.Json.NET 搜索 JSON 根对象的正确 JsonPath 表达式是什么?

    大多数例子涉及Stefan G ssner 的书店示例 http goessner net articles JsonPath index html e3 但是我正在努力为简单对象 无数组 定义正确的 JsonPath 表达式 Id 1 N
  • 从 JSON 响应中删除元素

    我有一个 JSON 字符串 我希望能够从中删除一些数据 以下是 JSON 响应 ResponseType VirtualBill Response BillHeader BillId 7134 DocumentId MN003 052206
  • 键绑定 - 鼠标中键与 Sublime Text 2

    有谁知道是否可以将鼠标中键绑定到 Sublime Text 2 中的操作 我知道可以进行一些鼠标交互 因为您可以使用后退和前进按钮 基本上 我将使用此按钮通过 sFTP 插件上传文件 这样我需要按下的按钮数量就会从 3 个减少到 1 个 目
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List

随机推荐

  • Crystal Reports 使用 13.0.2000 的哪个版本?

    我的任务是对几年前编写的 ASP NET Web Forms 应用程序进行一些小的更改 该应用程序的实现者已经不在我们身边 几年前就离开了 该应用程序中有 6 个报告 所有报告都使用某些版本的 Crystal Reports 当我看着Web
  • 如何使用 Eloquent 查询两个坐标之间的距离

    我知道这个问题已经被问过很多次了 但我没想到要根据我的需要来制作 我需要查询距离另一个用户最近的用户 基本上 我有一个users表 这个表有一个one to one与的关系users locations具有纬度和经度字段的表 所以我看过这个
  • 是否可以一步在堆上创建 lambda? [复制]

    这个问题在这里已经有答案了 我们可以像这样创建一个 lambda auto x 我可以在堆上创建一个副本 如下所示 auto y new decltype x x 问题是 是否可以一步完成此操作 在堆上创建 lambda 而不需要额外的步骤
  • 我可以阻止 JDialog 在按下退出/输入键时关闭吗?

    我创建了一个对话框来接受用户击键来更改菜单项的键绑定 我希望 Enter 和 escape 成为用户可以绑定的键 但它们都会关闭对话框 如何拦截这些压力机 编辑 对话框是使用 JOptionPane 和自定义组件创建的 GetKeyComp
  • 初始化全局变量类

    对于这样一个基本问题表示歉意 但我无法弄清楚 我知道你可以像这样初始化一个类 QFile file C example 但是如何从全局变量初始化它呢 例如 QFile file QFile class int main file need
  • 有没有办法仅通过国家/地区名称获取时区? [复制]

    这个问题在这里已经有答案了 您好 我知道这个问题被问了很多次 但这些问题与网络服务有关 我正在开发一个应用程序 显示用户选择国家 地区的时区 例如 我有所有国家 地区的列表 当用户从中选择一个国家 地区时 我想按国家 地区名称 可能是字符串
  • Python Facebook API - 光标分页

    我的问题涉及学习如何使用 Facebook 的 Python API 检索我的整个好友列表 当前结果返回一个具有有限数量好友的对象以及指向 下一页 的链接 我如何使用它来获取下一组朋友 请发布可能重复的链接 任何帮助将不胜感激 一般来说 我
  • Linux 中的 -emit-llvm

    我是 LLVM 的新手 尝试在 Linux 上生成人类可读的 ll 文件 我安装了 llvm gcc 但据我所知它只能生成汇编代码 S 选项 有什么办法可以得到类似于 llvm 在线生成的东西compiler http llvm org d
  • 使用 IIS 以纯文本形式提供不带扩展名的文件

    我尝试过使用来自的答案IIS 如何提供没有扩展名的文件 https stackoverflow com questions 19950882 iis how to serve a file without extension
  • 对象引用和对象哈希码之间的区别

    java中对象的引用和同一对象的哈希码值有什么区别 它们是完全不同的两个概念 Cat oldCat new Cat Cat newCat new Cat Cat oldCatRef oldCat 在上面的例子中 oldCat and old
  • 在 SQL 输出中插入双引号

    例如 在运行查询并查看输出后 select from People 我的输出如下 First Last Email Ray Smith email protected cdn cgi l email protection 我如何导出这些数据
  • 如何使用 JavaScript 检查文件是否存在?

    如何使用 JavaScript 检查文件是否存在 在本例中我想检查的是 xml 文件 如果您使用的是 jQuery 您可以尝试加载该文件 ajax type GET url some xml success function found e
  • 如何强制 pytest 写入颜色输出?

    即使在写入管道时 如何强制 pytest 以颜色显示结果 似乎没有任何命令行选项可以执行此操作 从 2 5 0 开始 py test 有这个选项 color yes 从 2 7 0 开始 还应该可以执行以下操作 export PYTEST
  • Spring 与 JSF 2 的比较 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何两两比较多次测量的增减?

    我有一个数据 我想通过取差值来两两比较测量值 如果差值大于 0 2 则添加另一列为 是 否则为 否 就像图像中的示例数据一样 并且 在每个人的最后 如果至少有一个 是 则最终结果为 是 我已手动填写第一行 但我想对我的所有个人 1000 个
  • Python 并删除列表列表中的重复项,无论列表中的顺序如何

    我已经搜索过 但没有找到与我相同的问题 我想从 python 中的列表列表中删除重复项 但是 我不在乎列表中值的顺序 我目前的做法太耗时了 我想做的事 A 1 2 3 2 3 4 3 4 5 3 2 4 我想搜索 A 并删除所有重复项 这里
  • 使用python同时向多个CC和多个TO收件人发送电子邮件

    分别尝试了多个 to 和多个 cc 效果很好 但是当我尝试两者时 出现错误 File 路径 Continuum anaconda2 envs mypython lib smtplib py 第 870 行 在 sendmail sender
  • std::string 用 bool 初始化

    考虑以下初始化 std string falseString false std string trueString true With g 5 2 0 编译器会抛出警告falseString 而错误为trueString With cla
  • 需要使用 R 从字符串列中提取单个字符

    背景 下面是我的gamedatadput 形式的数据集 它包含一些 MLB 比赛的比分 structure list team c NYM NYM BOS NYM BOS linescore c 010000000 10 1140006x
  • 如何在 Dhall 中将动态命名记录与静态记录合并?

    我正在 Dhall 中创建 AWS Step Function 定义 但是 我不知道如何创建他们使用的通用结构Choice如下例所示 Not Variable type StringEquals Private Next Public Th