2016-04-06 18 views
0

Her bir döngüden bir lambda ifadesine (yalnızca daha işlevsel bir kodlama stilini kolaylaştırmak için) nasıl dönüştürüleceğini anlamaya çalışıyorum.F # - Her döngü için bir lambda ifadesine dönüştürme

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 bir (string * JsonValue)[]

bir için her bir döngü ve belki de bunun yerine bir lambda ifade kullanmadan örneğin airlineFullName bir değer uygulanması daha kolay bir yolu var mı?

Teşekkür

+0

JSON verilerini ayrıştırma yapıyorsanız, JSON tipi sağlayıcı kontrol etmek isteyebilirsiniz: http://fsharp.github.io/FSharp.Data/library/JsonProvider.html –

cevap

1

görünüyor bu arıyoruz:

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

Sert olsa daha iyi görünüyor hangi söylemek. Bu, match satırını kaldırır, ancak tekrar kapatılması gereken ek parantezleri ekler.

Kodu daha işlevsel hale getirmek istiyorsanız, asıl soru şu: neden ilk etapta yineleniyorsunuz? Hem for ... in ... do hem de .iter, bir değer döndürmek yerine yan etkileri yürüten zorunlu yapılardır. Bir diğerinden daha işlevsel olmazdım. Daha işlevsel bir stil için, bir harita veya katlama gibi verilerden yeni, değişmez bir değer oluşturan bir şey aramak isteyebilirsiniz. Kullanım durumunuzu bilmeme rağmen, bu iyi bir seçim olabilir veya olmayabilir.

Yabani varsayımlar bir çılgınca tahmin örnek olarak

, ben airlineCode bir anahtar olarak kullanılan ve havayolu verilerini aşağıdaki gibi görünebilir verileri almak için işlevsel bir program oluşturmak için kullanılan olmadığını varsayarsak:

type Airline = 
    { FullName : string 
     ... } 

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

let airlines = 
    allAirlinesData 
    |> Map.ofArray 
    |> Map.map Airline.ofJson