2016-04-06 7 views
0

for-eachループをラムダ式に変換する方法を理解することに苦労しています(より機能的なコーディングスタイルを容易にするためです)。F# - for-eachループをラムダ式に変換する

for airlineData in allAirlinesData do 
    match airlineData with 
    | (airlineCode, data) -> 
     let airlineFullName = data.GetProperty("full_name").AsString() 
     let capacity = data.GetProperty("capacity").AsString() 
     let aircraftCount = data.GetProperty("aircraft_count").AsArray() 
     ... 
    | _ -> ... 

allAirlinesData(string * JsonValue)[]

ある代わりため、各ループおそらくラムダ式を使用することなく、例えばairlineFullNameに値を適用する任意の簡単な方法はありますか?

おかげ

+0

あなたはJSONデータを解析している場合、あなたはJSONタイプのプロバイダをチェックアウトする場合があります。http://fsharp.github.io/FSharp.Data/library/JsonProvider.html –

答えて

1

あなたがこれを見ているようだ:ハード

allAirlinesData |> Array.iter (fun (airlineCode, data) -> 
     let airlineFullName = ... 
     ... 
    ) 

しかし良く見えたと言うために。これにより、match行が削除されますが、もう一度閉じなければならない余分なカッコが追加されます。

コードをより機能的にしたい場合、主な質問は次のとおりです。最初はなぜ反復処理していますか? for ... in ... do.iterはどちらも、値を返す代わりに副作用を実行する必須の構成要素です。私は他のものよりも機能的なものを呼び出すつもりはない。もっと機能的なスタイルのためには、マップや折りたたみなど、データから新しい不変の値を構築するものを探したいかもしれません。 あなたのユースケースはわかりませんが、これは良い選択であるかもしれません。

ワイルド仮定乱暴に推測した例として

、私はairlineCodeがキーとして使用され、航空会社のデータを、次のようになります。データをインポートする機能プログラムを構築するために使用されていないと仮定した場合:

type Airline = 
    { FullName : string 
     ... } 

    static member ofJson (data : JsonValue) = 
     { FullName = data.GetProperty("full_name").AsString() 
      ... } 

let airlines = 
    allAirlinesData 
    |> Map.ofArray 
    |> Map.map Airline.ofJson 
関連する問題