我正在尝试使用一种返回一种或另一种类型的函数。在F#中有没有办法编码这个而不用创建一个新的有区别的联合类型并从函数中返回那个有区别的联合?
这是一个无法编译的简单示例:
type Json = JNumber of float
| JString of string
| JArray of seq<Json>
| JObject of Map<string, Json>
| JBool of bool
| JNull
let parseJson(jason:Json) = match jason with
|JNumber num -> num
|JString str -> str
|JArray arr -> arr |> Seq.map (fun e -> parseJson e)
|JObject obj -> obj |> Seq.map (fun (k,v) -> (k, parseJson v)) |> Map.ofArray
|JBool boo -> boo
|JNull -> None
基本上我希望能够将Json对象转换为F#数据结构。 (对于某些背景,我正在编写一个玩具json解析器,它可以在不同的步骤中转换文本 - &gt; Json对象 - &gt; F#数据结构)
答案 0 :(得分:1)
这不是一个好主意,在你的情况下,你现在非常希望返回一个联盟。想想如何使用这样的函数,你不能模式匹配。
对于这样的函数来说,你可以使用box
将每一个值转换为obj,但是每次你需要使用你的parseJson函数时你都会陷入投射它会工作,但它会不好。