2017-09-27 3 views
2

、任意のdataは以下の通り機能sprintfによりstringifyことができます。どのようにF#データに文字列を解析するのですか? F#ので

type someKindOfDataType = ... 
let data : someKindOfDataType = ... 
sprintf "%A" data 

は、我々は次のように、バックsomeKindOfDataTypeに文字列を解析するために反転機能を持つことができます:?

let parse<'someKingOfDataType> (s:string) : someKindOfDataType = .... 

javascriptのJSON.parseと似ていますか?

答えて

2

普段シリアライゼーションと呼ばれるものを記述している - ネットワークを介して送信することができる表現にインメモリデータ構造からの変換、XML、JSON、バイナリ等とすることができる - とデシリアライゼーション - その逆。

sprintf "%A"は、通常は生産とは対照的に、開発目的のためだけに、データの視覚的表現を便利にするように設計されています。デシリアライズする方法がないので、実際にはシリアライゼーションは行いません。

F#データを文字列にシリアル化する場合は、Newtonsoft.Jsonなどのライブラリ経由でJSONを使用することをおすすめします。

目的が異なるため、sprintf "%A"のようなF#ソースコードに似た文字列は生成されません。例:

Newtonsoft.Json.JsonConvert.SerializeObject [|Some 3; None|] 
// """[{"Case":"Some","Fields":[3]},null]""" 

Newtonsoft.Json.JsonConvert.DeserializeObject<int option []> """[{"Case":"Some","Fields":[3]},null]""" 
// [|Some 3; None|] 

あなたがにdeserialiseすると、文字列は、その型の有効なインスタンスを表していない場合は、この操作が例外をスローすることが種類を提供する必要があります。

+0

ご回答いただきありがとうございます。あなたの簡単な例は、あなたの答えが私が望むものであることを私に知らせる。 –

0

標準的な.NETの方法では、通常、解析しようとしているタイプのクラスでParseまたはTryParseメソッドを使用します。

しかし、F#のTryParse関数は出力パラメータを使用するのでそれほどフレンドリーではありませんが、F#コンパイラではそれをタプルとして見ることができますが、ここでの例です:

let a = Int32.Parse "5" 
let b = 
    match Int32.TryParse "5" with 
    | true, value -> Some value 
    | _   -> None 

あなたはF#+の両方の機能を持つライブラリを使用したい場合はparseとあなたのためのすべての上記しtryParse:それはタイプ限り働く

#r @"FSharpPlus.dll" 
open FSharpPlus 
open System 

let (a:int) = parse "5" 
let (b:int option) = tryParse "5" 
let (c: Net.IPAddress option) = tryParse "10.0.0.1" 

// val a : int = 5 
// val b : int option = Some 5 
// val c : Net.IPAddress option = Some 10.0.0.1 

ParseまたはTryParseが定義されています。

+0

ありがとうございました。あなたの図書館を勉強して投稿するのは楽しいです。 F#+でインライン関数の解析をオーバーロードするテクニックは面白くて華麗です。戻り値の型をシグネチャとして使用して、converter.fsの型パーサーで静的解析関数で実装されたパーサーを選択することができます。しかし、それぞれの型について言及すると、唯一のパーサ関数を書いて、型パーサで定義します。これは私のものではありませんが、あなたの答えにもう一度感謝します。 –

関連する問題