SML 使用数据类型列表
SML consing a datatype list
如果我有这个 SML 数据类型
datatype json =
Num of real
| String of string
| False
| True
| Null
| Array of json list
| Object of (string * json) list
假设我有这个 Array
只有一个 Object
这使它成为一个 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
并使用 ::
是的,这是我在华盛顿大学上学期 编程语言 的家庭作业,我正在自己做。 This 是作业。
我的基本问题是我不知道如何使用递归调用添加到 Array
。如果我需要生成一个包含 Objects
的 Array
并在每个递归调用中向 Array
开始的 Object
添加一个新的 Object
,那将如何完成?我见过 Succ
或 Cons
的示例,例如后继构造函数,但这些只是创建一个递归的嵌套对象,例如
val four = Succ (Succ (Succ (Succ Zero)))
...但这没有帮助...
Array [...]
不是 json list
,而是 json
,并且 ::
不能将两个 json
组合成一个列表。
您需要将 "inside" 加入列表 Array
:
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
也是一个构造函数,即像一个函数,我们可以在这个构造函数调用内部做一些事情,即我们可以在 里面 做一个普通的列表 cons Array
构造函数
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 的缺点”功能。附加解决方案的尾递归版本:
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
如果我有这个 SML 数据类型
datatype json =
Num of real
| String of string
| False
| True
| Null
| Array of json list
| Object of (string * json) list
假设我有这个 Array
只有一个 Object
这使它成为一个 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
并使用 ::
是的,这是我在华盛顿大学上学期 编程语言 的家庭作业,我正在自己做。 This 是作业。
我的基本问题是我不知道如何使用递归调用添加到 Array
。如果我需要生成一个包含 Objects
的 Array
并在每个递归调用中向 Array
开始的 Object
添加一个新的 Object
,那将如何完成?我见过 Succ
或 Cons
的示例,例如后继构造函数,但这些只是创建一个递归的嵌套对象,例如
val four = Succ (Succ (Succ (Succ Zero)))
...但这没有帮助...
Array [...]
不是 json list
,而是 json
,并且 ::
不能将两个 json
组合成一个列表。
您需要将 "inside" 加入列表 Array
:
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
也是一个构造函数,即像一个函数,我们可以在这个构造函数调用内部做一些事情,即我们可以在 里面 做一个普通的列表 cons Array
构造函数
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 的缺点”功能。附加解决方案的尾递归版本:
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