2016-03-30 9 views
0

型を返す関数を用意しようとしています。 F#でを符号化する方法がありますか?は新しい識別された共用体型を作成し、その識別された共用体を関数から戻しますか?F#:1つの関数から異なる型の値を返す

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 

を基本的に私はFの#のデータ構造にJSONオブジェクトを回すことができるようにしたい:ここ

はコンパイルされません簡単な例です。 (いくつかの背景のために、私は別のステップでテキスト→Jsonオブジェクト→F#データ構造を変換するおもちゃjsonパーサーを書いています)

+3

これは時代の全体の束を尋ねてきたし、それは本当に不可能です。単純な理由は '' x = parseJson what any'''''と '' x'''の型がコンパイルされていればどうでしょうか? –

+0

@JohnPalmerこれは、タイププロバイダが何であるのでしょうか?私の考えは、質問は正しいとは限りませんが、答えは "タイププロバイダ"を作成することです... gnicholasの場合:https://msdn.microsoft.com/en-us/library/hh361034.aspxまたはこれをチェックしてください: http://fsharp.github.io/FSharp.Data/library/JsonProvider.html、おそらくhttps://github.com/fsharp/FSharp.Data/tree/master/src/Jsonのソース –

+0

@HelgeReneUrholm型プロバイダは実際に複雑な型を返すことに注意してください。コンパイル時に型を生成できるように、実際にはテンプレートファイルが必要です。実行時に新しいファイルを使用する場合は、テンプレート –

答えて

1

これは良い考えではありません。ポイント。そのような機能がどのように使われるのか考えてみましょう。パターンマッチはできません。

このような関数の場合、すべての単一の値をboxでobjにキャストできますが、parseJson関数を使用する必要があるたびにキャストにトラップされますが、うまくいかないでしょう。

私はこのような何かについて話している: https://stackoverflow.com/a/2994300/1485641

+1

それは私が考えたものです。しかし、尋ねる価値がある。ありがとう! – gnicholas

関連する問題