Я учу себя F # - для удовольствия и прибыли! - и хотя я сделал несколько шагов, я наткнулся на камень преткновения с использованием алгебраических типов. Ниже приведен тип JSON, который я кодировал для сериализации произвольной структуры JSON в строку. Конечно, я открыт для субъективных комментариев относительно его дизайна и эффективности, но в основном я сосредоточен на строке 7:
type JSON =
| JString of string
| JNumber of decimal
| JBool of bool
| JNull
| JArray of JSON list
| JObject of Map< JSON, JSON >
with
member this.Serialize =
let rec serialize ( element : JSON ) =
match element with
| JString str ->
"\"" + str + "\""
| JNumber num ->
num.ToString()
| JBool bln ->
bln.ToString().ToLower()
| JNull ->
"null"
| JArray ary ->
"[" + String.concat "," ( List.map serialize ary ) + "]"
| JObject obj ->
"{" + (
Map.fold (
fun state key value ->
state + ( match state with "" -> "" | _ -> "," )
+ ( serialize key )
+ ":"
+ ( serialize value ) ) "" obj ) + "}"
serialize( this )
Любой, кто знаком с JSON, знает, что пара ключ / значение объекта JSON должна указываться в строке, а не только в любом элементе / значении JSON. Есть ли способ дополнительно ограничить первый тип параметра карты? Это, конечно, не работает:
type JSON =
... elided ...
| JObject of Map< JSON.JString, JSON >
...
type JSON =
... elided ...
| JObject of Map< JString, JSON >
...
type JSON =
... elided ...
| JObject of Map< string, JSON >
Спасибо.