SML包含一个数据类型列表



如果我有这个SML数据类型

datatype json =
Num of real
| String of string
| False
| True
| Null
| Array of json list
| Object of (string * json) list

假设我有这个只有一个ObjectArray,这使它成为json列表

Array[Object[("a", Num (1.0)),("b", True)]]

如何将新的Object与现有的Array进行比较?我试过一个简单的::,但没有用

Object[("a", Num (1.0)),("b", True)]::Array[Object[("a", Num (2.0)),("b", True)]]

这给出了一个错误。我必须为此建立自己的缺点吗?SML列表似乎是'a list,它应该允许json list并与::一起工作

是的,这是我上学期在华盛顿大学编程语言的家庭作业,我自己在做。这就是作业。

我的基本问题是我不知道如何用递归调用添加到Array中。如果我需要生成一个包含ObjectsArray,并在每次递归调用的起始Array中添加一个新的Object,该怎么做?我见过SuccCons的例子,例如后继构造函数,但它们只是创建一个递归的嵌套对象,如

val four = Succ (Succ (Succ (Succ Zero)))

但这没有帮助。。。

Array [...]不是json list,而是json,并且::不能将两个json合并到一个列表中。

您需要在Array:的"内部"列表上进行cons

Array (Object [("a", Num 1.0)] :: ([Object [("a", Num 2.0)]]))

您可能想要添加一个"cons-for-JSON"函数;类似的东西

fun json_cons o (Array os) = Array (o :: os)
| json_cons _ _ = ... handle structural error ...

您也可以发明自己的二进制中缀运算符,但这可能有点高级。

在molbdnilo的帮助下,我克服了如何创建Array列表的心理障碍。由于Array也是一个构造函数,也就是说,就像一个函数一样,我们可以在这个构造函数函数调用中做一些事情,也就是我们可以在Array构造函数中做一个普通的列表cons
fun json_cons (ob, (Array os)) = Array (ob::os)
| json_cons (_,_) = (Array [])

测试

- json_cons (Object[("a", Num (1.0)),("b", True)], Array[])
val it = Array [Object [(#,#),(#,#)]] : json

下面是另一个直接构建的例子

- Array (Object [("a", Num 1.0)] :: ([Object [("a", Num 2.0)]]))
val it = Array [Object [(#,#)],Object [(#,#)]] : json

对于习惯了1::[2]的人来说,这很奇怪,尤其是作为cdr部分的([Object[...]])。这是代码

fun make_silly_json (i) =
case i of
0 => Array [Object []]
| x => json_cons (Object [("n", Num (Real.fromInt (x))),("b", True)], make_silly_json (x-1))

测试

make_silly_json 3
val it = Array [Object [(#,#),(#,#)],Object [(#,#),(#,#)],Object [(#,#),(#,#)],Object []] : json

类型。。。

感谢molbdnilo在创建"JSON的cons";作用附加解决方案的尾部递归版本:

fun make_silly_json i =
let fun aux(i, acc) =
if i = 0
then acc
else let val json_val = Object[("n", Num(int_to_real(i))),("b", True)]
fun json_con (obj, (Array os)) =
Array(obj::os)
| json_con (_,_) = (Array [])
in
aux(i-1, json_con(json_val, acc))
end
in aux(i, Array[])
end

最新更新