在bs-jsonandThen
库中,提供了一个使用组合器将 json 结构转换为树的示例。原始示例可以在 GitHub上的 ML 接口文件中找到。将此文件中的函数复制decodeTree
到浏览器原因工具会显示语法错误。
非常感谢任何让这个工作的指针。
我尝试将其转换为 Reason3 会导致类型错误。这是代码:
type tree('a) =
| Node('a, list(tree('a)))
| Leaf('a);
let json = {| {
"type": "node",
"value": 9
"children": [{
"type": "leaf",
"value": 5,
"children": [{
"type": "leaf",
"value": 3
}, {
"type": "leaf",
"value": 2
}]
}, {
"type": "leaf",
"value": 4
}]
} |};
let decodeTree = (decodeValue, json) =>
Json.Decode.(
field("type", string)
|> andThen(type_ =>
switch type_ {
| "node" =>
Node(
field("value", decodeValue),
field("children", children =>
children |> array(decodeTree) |> map(Array.to_list)
)
)
| "leaf" => Leaf(field("value", decodeValue))
}
)
);
let myTree = json |> Json.parseOrRaise |> decodeTree(Json.Decode.int);
这是类型错误,
This has type:
tree('a)
But somewhere wanted:
Json.Decode.decoder('b) (defined as (Js.Json.t) => 'b)