С помощью 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]
, это странно, особенно ([Object[...]])
в качестве cdr часть. Так вот код
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
... типы ...