【问题标题】:Dhall Record to TextDhall 记录到文本
【发布时间】:2020-02-13 12:00:44
【问题描述】:

我正在寻找与 Java 的 toString 等效的 Dhall,因此我可以在另一条记录中嵌入一些原始 JSON,但我希望确保生成的 JSON 结构有效。

我有一个记录,例如{ name : Text, age : Natural } 并希望将值转换为文本,例如:

let friends = 
[ { name = "Bob", age = 25 }, { name = "Alice", age = 24 }]
in { id = "MyFriends", data = Record/toString friends }

会产生:

{
  "id": "MyFriends, 
  "data": "[ { \"name\": \"Bob\", \"age\": 25 }, { \"name\": \"Alice\", \"age\": 24 }]" 
}

这在 Dhall 中可行吗?

【问题讨论】:

    标签: dhall


    【解决方案1】:

    无法自动导出到 JSON 的转换,但您可以使用 Prelude 对 JSON 的支持来生成正确构造的 JSON 字符串(这意味着它们永远不会格式错误),如下所示:

    let Prelude = https://prelude.dhall-lang.org/v13.0.0/package.dhall
    
    let Friend = { name : Text, age : Natural }
    
    let Friend/ToJSON
        : Friend → Prelude.JSON.Type
        =   λ(friend : Friend)
          → Prelude.JSON.object
              ( toMap
                  { name = Prelude.JSON.string friend.name
                  , age = Prelude.JSON.natural friend.age
                  }
              )
    
    let Friends/ToJSON
        : List Friend → Prelude.JSON.Type
        =   λ(friends : List Friend)
          → Prelude.JSON.array
              (Prelude.List.map Friend Prelude.JSON.Type Friend/ToJSON friends)
    
    let friends = [ { name = "Bob", age = 25 }, { name = "Alice", age = 24 } ]
    
    in  { id = "MyFriends", data = Prelude.JSON.render (Friends/ToJSON friends) }
    

    这会产生以下结果:

    { data =
        "[ { \"age\": 25, \"name\": \"Bob\" }, { \"age\": 24, \"name\": \"Alice\" } ]"
    , id = "MyFriends"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多