首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Dhall将递归类型编码为JSON

使用Dhall将递归类型编码为JSON
EN

Stack Overflow用户
提问于 2021-07-21 14:39:25
回答 1查看 59关注 0票数 1

我想要的输出的简化版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "dynamic-name": {
    "type": "type",
    "fields": {
      "inner-dynamic-name": {
        "type": "inner-type",
        "analyzer": "analyzer"
      }
    }
  }
}

下面是我用来生成它的Dhall代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let Field
    : Type
    = (Field : Type) ( Leaf
        : { mapKey : Text, mapValue : { type : Text, analyzer : Optional Text } } →
            Field
        ) ( Node
        : { mapKey : Text, mapValue : { type : Text, fields : List Field } } →
            Field
        ) →
        Field

let example
    : Field
    = λ(Field : Type)λ ( Leaf
        : { mapKey : Text, mapValue : { type : Text, analyzer : Optional Text } } →
            Field
        )λ ( Node
        : { mapKey : Text, mapValue : { type : Text, fields : List Field } } →
            Field
        ) →
        Node
          { mapKey = "dynamic-name"
          , mapValue =
            { type = "type"
            , fields =
              [ Leaf
                  { mapKey = "inner-dynamic-name"
                  , mapValue =
                    { type = "inner-type", analyzer = Some "analyzer" }
                  }
              ]
            }
          }

in  example

但是,在将我的Dhall配置传递给dhall-to-json时,我得到以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error: Cannot translate to JSON                                            
                                                                                
Explanation: Only primitive values, records, unions, ❰List❱s, and ❰Optional❱    
values can be translated from Dhall to JSON                                     
                                                                                
The following Dhall expression could not be translated to JSON:λ(_ : Type)λ ( _
    : { mapKey : Text, mapValue : { analyzer : Optional Text, type : Text } } →
        _@1
    )λ(_ : { mapKey : Text, mapValue : { fields : List _@1, type : Text } } → _@2) →
    _
      { mapKey = "dynamic-name"
      , mapValue =
        { fields =
          [ _@1
              { mapKey = "inner-dynamic-name"
              , mapValue = { analyzer = Some "analyzer", type = "inner-type" }
              }
          ]
        , type = "type"
        }
      }

我运行的是1.7.6版的dhall-to-json。我做错了什么?

(忽略:我需要包含更多的单词才能允许发布我的问题,但任何更多的内容似乎都是多余的。最后一句话是我是黑客。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-22 17:30:05

我将我的答案从https://github.com/dhall-lang/dhall-haskell/issues/2259复制到这里:

dhall-to-json不能直接处理自定义递归类型,但它可以处理一种可区分的递归类型,即Prelude.JSON.Type,所以下面这样的代码就可以工作了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let JSON =
      https://prelude.dhall-lang.org/JSON/package.dhall
        sha256:5f98b7722fd13509ef448b075e02b9ff98312ae7a406cf53ed25012dbc9990ac

let Field
    : Type
    = (Field : Type) ( Leaf
        : { mapKey : Text
          , mapValue : { type : Text, analyzer : Optional Text }
          } →
            Field
        ) ( Node
        : { mapKey : Text, mapValue : { type : Text, fields : List Field } } →
            Field
        ) →
        Field

let example
    : Field
    = λ(Field : Type)λ ( Leaf
        : { mapKey : Text
          , mapValue : { type : Text, analyzer : Optional Text }
          } →
            Field
        )λ ( Node
        : { mapKey : Text, mapValue : { type : Text, fields : List Field } } →
            Field
        ) →
        Node
          { mapKey = "dynamic-name"
          , mapValue =
            { type = "type"
            , fields =
              [ Leaf
                  { mapKey = "inner-dynamic-name"
                  , mapValue =
                    { type = "inner-type", analyzer = Some "analyzer" }
                  }
              ]
            }
          }

let Field/toJSON
    : Field → JSON.Type
    = λ(field : Field) →
        field
          JSON.Type
          ( λ ( args
              : { mapKey : Text
                , mapValue : { type : Text, analyzer : Optional Text }
                }
              )JSON.object
                [ { mapKey = args.mapKey
                  , mapValue =
                      JSON.object
                        ( toMap
                            { type = JSON.string args.mapValue.type
                            , analyzer =
                                merge
                                  { None = JSON.null, Some = JSON.string }
                                  args.mapValue.analyzer
                            }
                        )
                  }
                ]
          )
          ( λ ( args
              : { mapKey : Text
                , mapValue : { type : Text, fields : List JSON.Type }
                }
              )JSON.object
                [ { mapKey = args.mapKey
                  , mapValue =
                      JSON.object
                        ( toMap
                            { type = JSON.string args.mapValue.type
                            , fields = JSON.array args.mapValue.fields
                            }
                        )
                  }
                ]
          )

in  Field/toJSON example

…而dhall-to-json接受这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ dhall-to-json --file ./example.dhall
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "dynamic-name": {
    "fields": [
      {
        "inner-dynamic-name": {
          "analyzer": "analyzer",
          "type": "inner-type"
        }
      }
    ],
    "type": "type"
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68471542

复制
相关文章
如何将 JSON 字典编码为 JSONEncoder
JSONEncoder 处理类型安全,因此我们需要为所有可能的类型声明枚举 JSONValue。我们还需要一个自定义 initializer 来从 JSON 字典中初始化 JSONValue。
Swift社区
2022/04/04
1.1K0
使用MediaCodeC将图片集编码为视频
这是MediaCodeC系列的第三章,主题是如何使用MediaCodeC将图片集编码为视频文件。在Android多媒体的处理上,MediaCodeC是一套非常有用的API。此次实验中,所使用的图片集正是MediaCodeC硬解码视频,并将视频帧存储为图片文件文章中,对视频解码出来的图片文件集,总共332张图片帧。 若是对MediaCodeC视频解码感兴趣的话,也可以浏览之前的文章:MediaCodeC解码视频指定帧,迅捷、精确
AiLo
2019/11/22
2.5K0
为 Redis 添加 JSON 数据类型
1. 简介 Redis 本身有比较丰富的数据类型,例如 String、Hash、Set、List JSON 是我们常用的数据类型,当我们需要在 Redis 中保存 json 数据时是怎么存放的呢? 一般是用 String 或者 Hash,但还是不太方便,无法灵活的操作 json 数据 在 Redis 4.0 中,有一个重大改进:modules 模块系统,可以让我们开发新的功能,集成到 redis 中 rejson 就是一个新的模块,为 redis 提供了 json 存储能力 2. 示例 2.1)基础操作
dys
2018/04/04
13K0
LeetCode 431. 将 N 叉树编码为二叉树(递归/层序)
设计一个算法,可以将 N 叉树编码为二叉树,并能将该二叉树解码为原 N 叉树。 一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。 类似地,一个二叉树是指每个节点都有不超过 2 个孩子节点的有根树。 你的编码 / 解码的算法的实现没有限制,你只需要保证一个 N 叉树可以编码为二叉树且该二叉树可以解码回原始 N 叉树即可。
Michael阿明
2021/02/19
7350
解决Python3将数据保存为json,中文显示为Unicode编码的问题
在利用 Python 将字典数据保存为 json 时,查看数据发现中文全部显示的为 Unicode 编码,如下所示:
叶庭云
2022/05/09
4.3K0
解决Python3将数据保存为json,中文显示为Unicode编码的问题
Swift Codable 将任意类型解析为想要的类型
默认情况下,使用 Swift 内置的 Codable API 解析 JSON 时,我们的属性类型需要和Json 中的类型保持一致,否则就会解析失败。
韦弦zhy
2021/11/24
2K0
使用python查看文本编码类型
文件主要分为二进制文件和文本文件这两种,看你想要查看哪种文件的编码,如果是文本文件的话,open函数里的就要用r,二进制文件用的是rb,别搞错哦!
用户1685462
2021/07/20
1.4K0
python 将json类型的字符串转换成字典 使用demo
我们从网页上抓取的很多数据都是json格式,保存下来也就是字符串格式,我们这时候如果使用字符串拼接或者正则表达式在json字符串中寻找信息是比较麻烦的。把json字符串转换成python中的字典,然后再使用字典查找。
用户7886150
2021/01/14
2.5K0
前端如何将json数据导出为excel文件
前端人员在开发时,有时为了满足用户需求,需要下载excel文件。这里通常有两种做法,一种是后端工程师将数据转化为excel,然后前端进行下载即可,还有一种方式,前端请求需要下载的数据,在浏览器端生成excel文件,然后进行下载。
挥刀北上
2020/08/04
7.4K0
前端如何将json数据导出为excel文件
【Rust日报】2023-02-01 将递归重写为迭代
ReadMore: https://github.com/Aandreba/blaze
MikeLoveRust
2023/02/15
5270
【Rust日报】2023-02-01 将递归重写为迭代
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
本文实例讲述了PHP自定义递归函数实现数组转JSON功能。分享给大家供大家参考,具体如下:
用户8824291
2021/07/13
1.1K0
本文将向您展示如何在 Flutter 中编码/解码 JSON
导入dart:convert库: import 'dart:convert'; 使用: json.encode()或jsonEncode()用于编码 json.decode()或jsonDecode()用于解码 例子 示例 1:JSON 编码 final products = [ { 'id': 1, 'name': 'Product #1' }, { 'id': 2, 'name': 'Product #2' } ];
徐建国
2021/09/08
1.6K0
【算法】递归算法 ② ( 使用递归实现二分法 | if else 编码优化 )
https://leetcode.cn/problems/binary-search/
韩曙亮
2023/03/30
6670
【mysql】JSON 类型
JSON 类型 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。 在MySQL 5.7中,就已经支持JSON数据类型。在MySQL 8.x版本中,JSON类型提
兮动人
2022/03/13
2.2K0
Go使用类型断言处理动态JSON字段
Go作为强类型语言,在序列化和反序列化过程中,都不可避免地需要定义结构体:在有IDL的情况下结构体可以使用工具自动生成(kitex),在无IDL的情况下就得手撸。
Steve Wang
2023/10/12
2500
pycharm编码设置为utf-8._python字符编码使用ascii编码对么
我试着读入两个文本文件,一个用UTF8编码。我在PyCharm中使用python3。在
全栈程序员站长
2022/09/27
8860
Packer 如何将 JSON 的配置升级为 HCL2
在新版本的 Packer 中,如果你需要创建服务器的镜像的话,推荐使用 HCL2 的配置文件。
HoneyMoose
2021/06/24
9650
Packer 如何将 JSON 的配置升级为 HCL2
使用Typora将MarkDown导出为PDF
使用Typora导出的PDF文件格式规整、样式好看。 1. 下载Typora image.png 2. Typora界面 image.png 3. 导出为PDF image.png 4. 查看 ima
夹胡碰
2020/11/24
2.9K0
使用Typora将MarkDown导出为PDF
点击加载更多

相似问题

如何生成包含数据的递归Dhall和类型

12

有效图的类型能在Dhall中编码吗?

10

编码为模块递归的多态递归的类型推断

12

dhall无效替代类型

12

将NaN编码为JSON

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文