Этот вопрос исходит от человека, который работает над переходом от R к F #. Я полностью признаю, что мой подход здесь может быть неправильным, поэтому я ищу способ F # сделать это. У меня есть ситуация, когда я хочу перебирать набор файлов XML, анализировать их и извлекать несколько значений, чтобы определить, какие из них нуждаются в дальнейшей обработке. Моим естественным наклоном является Карта по массиву данных XML, exampleData
в этом случае, разобрать каждый с использованием провайдера типа RawDataProvider
и, наконец, создать объект Map для каждого файла, содержащего проанализированный XML, значение статуса из XML и ItemId стоимость.F # тип коллекции для смешанных типов
Оказывается, что тип карты в F # не похож на список в R. Списки в R являются, по существу, хэш-картами, которые могут поддерживать смешанные типы. Похоже, что тип карты в F # не поддерживает сохранение смешанных типов. Я нашел, что это невероятно полезно в моей работе R, и я ищу, что для этого нужно для правой коллекции F #.
Или, я думаю об этом, все неправильно? Это очень естественный способ обработки данных в R, поэтому я ожидаю, что в F # также будет способ сделать это. Предполагается, что я собираюсь провести дальнейший анализ и добавить дополнительные элементы данных в эти коллекции.
Update: Это кажется таким простым вариантом использования, что должно быть идиоматическим способом сделать это в F # без необходимости определить тип записи для каждого шага анализа. Я обновил свой пример, чтобы еще раз иллюстрировать то, что я пытаюсь сделать. Я хочу, чтобы вернуть массив объектов Map, которые я проанализированные:
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"])
Не то, о чем вы просили, но я думаю, что 'File.ReadAllLines (file) |> Array.reduce (+)' может быть заменен на 'File.ReadAllText (файл)' – CoderDennis
@CoderDennis спасибо за информацию –
Вы должны используйте тип записи вместо слабо типизированного хеша. –