To pytanie pochodzi od kogoś, kto pracuje nad przejściem z R na F #. W pełni zgadzam się, że moje podejście tutaj może być błędne, więc szukam sposobu F # na to. Mam sytuację, w której chcę iterować za pomocą zestawu plików XML, analizować je i wyodrębniać kilka wartości, aby określić, które z nich wymagają dalszego przetwarzania. Moją naturalną skłonnością jest Mapowanie na tablicy danych XML, exampleData
w tym przypadku, przeanalizowanie każdego z nich za pomocą dostawcy typu RawDataProvider
i wreszcie utworzenie obiektu Map dla każdego pliku zawierającego sparsowany XML, wartość Status z XML i ItemId wartość.Typ kolekcji F dla typów mieszanych
Okazuje się, że typ mapy w F # nie jest podobny do listy w R. Listy w R są zasadniczo hashmaps, które mogą obsługiwać mieszane typy. Wygląda na to, że typ mapy w F # nie obsługuje przechowywania typów mieszanych. Odkryłem, że jest to niesłychanie przydatne w mojej pracy R i szukam odpowiedniej kolekcji F # do tego.
Czy też myślę o tym wszystko źle? Jest to bardzo naturalny sposób przetwarzania danych w R, więc oczekiwałbym, że będzie sposób, aby to zrobić również w F #. Zakładam, że zamierzam przeprowadzić dalszą analizę i dodać do tych kolekcji dodatkowe elementy danych.
Aktualizacja: To wydaje się tak prosty przypadek użycia, że musi istnieć idiomatyczne to sposobem w F #, bez konieczności definiowania typu rekordu na każdym etapie analizy. Zaktualizowałem mój przykład, aby dokładniej zilustrować to, co próbuję zrobić. Chcę zwrócić tablicę obiektów Mapa, że mam analizowanych:
type RawDataProvider = XmlProvider<"""<product Status="Good" ItemId="123" />""">
let exampleData = [| """<product Status="Good" ItemId="123" />"""; """<product Status="Bad" ItemId="456" />"""; """<product Status="Good" ItemId="789" />"""|]
let dataResult =
exampleData
|> Array.map(fun fileData -> RawDataProvider.Parse(fileData))
|> Array.map(fun xml -> Map.empty.Add("xml", xml).Add("Status", xml.Status).Add("ItemId", xml.ItemId))
|> Array.map(fun elem -> elem.["calc1Value"] = calc1 elem["itemId"])
|> Array.map(fun elem -> elem.["calc2"] = calc2 elem.["ItemId"] elem.["calc1Value"])
Nie o co prosiłeś, ale myślę, że 'File.ReadAllLines (File) |> Array.reduce (+)' może być zastąpiony 'File.ReadAllText (pliku)' – CoderDennis
@CoderDennis dzięki za info –
Powinieneś użyj typu rekordu zamiast luźno wpisanego skrótu. –