gpt4 book ai didi

dictionary - 混合类型的 F# 集合类型

转载 作者:行者123 更新时间:2023-12-04 19:46:43 25 4
gpt4 key购买 nike

这个问题来自一个致力于从 R 过渡到 F# 的人。我完全承认我在这里的方法可能是错误的,所以我正在寻找 F# 方法来做到这一点。我有一种情况,我想遍历一组 XML 文件,解析它们,然后提取几个值以确定哪些值需要进一步处理。我的自然倾向是映射 XML 数据数组,在本例中为 exampleData,使用 RawDataProvider 类型提供程序解析每个数据,最后为每个包含解析的 XML、来自 XML 的状态值和 ItemId 的文件创建一个 Map 对象值(value)。

事实证明,F# 中的 Map 类型不像 R 中的列表。 R 中的列表本质上是可以支持混合类型的哈希映射。 F# 中的 Map 类型似乎不支持存储混合类型。我发现这在我的 R 工作中非常有用,我正在寻找合适的 F# 集合。

或者,我想这一切都错了吗?这是我在 R 中处理数据的一种非常自然的方式,所以我希望在 F# 中也有一种方法可以做到这一点。假设我将进行进一步分析并向这些集合添加其他数据元素。

更新:
这似乎是一个如此简单的用例,在 F# 中必须有一种惯用的方法来执行此操作,而不必为分析的每个步骤定义 Record 类型。我已经更新了我的示例以进一步说明我正在尝试做的事情。我想返回一个我分析过的 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"])

最佳答案

这就是我在这里认为几乎惯用的 - 我保持与您的示例相同的形状,以便您可以匹配两者:

let dataResult =
exampleData
|> Array.map(fun fileData -> RawDataProvider.Parse(fileData))
|> Array.map(fun xml -> xml, calc1 xml.ItemId)
|> Array.map(fun (xml, calcedValue1) -> xml, calcedValue1, calc2 xml.ItemId calcedValue1)

什么 XmlProvider真正为您提供的不仅仅是 xml 解析,而是它生成 xml 的强类型表示这一事实。这比将数据放在 map 中要好,因为它可以为您的程序是否在做正确的事情提供更有力的保证。例如它不会让你混淆 itemIdItemId正如它在您的代码片段中发生的那样;)

对于您在以下步骤中计算的值,您可以使用元组而不是记录。一般来说,记录比元组更受欢迎,因为它们会导致更易读的代码,但是将不同类型的相关值组合到临时聚合中确实是使用元组的场景。

现在,我说的几乎是惯用语 - 我会将解析和处理解析的 xml 分解为单独的函数,并计算两者 calc1calc2导致单个函数而不是组合两个 Array.maps像这样:
let dataResult = 
parsedData
|> Array.map(fun xml ->
let calced1 = calc1 xml.ItemId
xml, calced1, calc2 xml.ItemId calced1)

如果您来自 R 背景,您可能想查看 Deedle对于替代方法。它为您提供了类似于 F# 中的 R 的工作流。

关于dictionary - 混合类型的 F# 集合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com