gpt4 book ai didi

f# - 递归爬取各种记录类型列表的层次结构

转载 作者:行者123 更新时间:2023-12-04 05:36:27 25 4
gpt4 key购买 nike

我有一个数据结构,它包含一个 F# 记录列表,其中一个成员本身是一个不同类型的记录列表,大约有 4 个级别的深度层次结构。我必须创建这个结构的代码有点冗长但有效。我现在希望创建一个通用尾递归函数,该函数从层次结构的顶层分解此数据结构的列表,以生成层次结构列表底层中项目数计数的映射。我可以通过创建函数来开发所需的代码来分解层次结构的每个级别的记录,但是您最终会使用相同的递归函数来处理不同记录类型的列表。以下是我尝试以非详细方式实现这一点的方式,但出现以下错误:

This runtime coercion or type test from type
    'a
to
    MarshallingPanel
involves an indeterminate type based on information prior to this program point. Runtime type tests are not allowed on some types.



我知道错误是 F# 中的类型推断和我可以找到的类型测试模式匹配示例涉及基类引用或可区分联合。我将尝试联合,如果这不起作用,请详细说明,但如果你们中的任何一个 F# 大师有要遵循的模式或任何输入,那都会很棒。
let rec mapAsRequired items (currentCBMap: Map<string*string*string*string, int>) =
match items with
| head :: tail ->
match head with
| :? MarshallingPanel as marshallingPanel ->
mapAsRequired marshallingPanel.PLCs currentCBMap
| :? PLC as plc ->
mapAsRequired plc.Racks currentCBMap
| :? Rack as rack ->
mapAsRequired rack.Slots currentCBMap
| _ ->
mapAsRequired [] currentCBMap
mapAsRequired tail currentCBMap
| [] ->
currentCBMap

let rec mapMarshallingPanels (marshallingPanels:MarshallingPanel list) (currentCBMap: Map<string*string*string*string, int>) =
match marshallingPanels with
| head :: tail ->
mapMarshallingPanels tail (mapAsRequired (List.sortBy(fun (plc:PLC) -> rankProcessorForCBAlllocation plc.PLCNo) head.PLCs) currentCBMap)
| [] ->
currentCBMap

mapAsRequired marshallingPanels Map.empty

最佳答案

要解决此问题,您需要匹配 obj 类型的内容。而不是基于不确定类型的值(类型参数 'a )。你可以通过添加 box 来做到这一点。 :

match box head with 
| :? MarshallingPanel as marshallingPanel ->
mapAsRequired marshallingPanel.PLCs currentCBMap
| :? PLC as plc ->
mapAsRequired plc.Racks currentCBMap

但是,我完全同意 John Palmer 的评论,即使用受歧视的联合似乎是您的目的的更好选择。

关于f# - 递归爬取各种记录类型列表的层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11860955/

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