从分支到叶子检索匹配值

时间:2014-10-12 13:15:42

标签: list f# tree

因此,我试图将公司作为公司的分支机构和子公司制作一棵树。 每个公司/子公司都包含一个名称,一个总收入和一个包含其子公司的清单。

我已经为公司树中的所有公司/子公司创建了一个返回元组(名称,总收入)的函数。

我现在要做的是找到某个公司/子公司的总收入,这意味着该功能应该将所有子公司的总收入与公司一起添加并返回结果。它应该只有一个字符串作为输入(公司的名称)。

type Department = a' list
              and a' = | SubDep of string * float
                       | Company of string * float * Department;;
let company =
    Company("Arla", 1000.0, [SubDep("Karolines Køkken", 500.0); 
                    Company("Lurpak", 200.0, [SubDep("Butter",100.0); SubDep("Milk", 100.0)]);
                    SubDep("Arla Buko", 100.0);
                    Company("Riberhus", 200.0, [SubDep("Cheese",200.0)])
                   ]);;

所以运行示例应该是:

companyTotalIncome "Arla" company;;

结果应该是:2400

1 个答案:

答案 0 :(得分:1)

总结一切你可以做这样的事情(不要真的知道你为什么需要这里的公司名称,就像你刚才总结的那样):

let rec depIncome = 
   function
   | SubDep (_, income)      -> income
   | Company (_,income, sub) -> income + totalIncome sub

and totalIncome =
    List.sumBy depIncome

但是你的数据结构真的很奇怪(为什么一个部门的公司名单?)

我会这样做:

type Department = 
   { name : String
     income : float 
   }

type Company = 
   { name : String
     departmens : Department list
     subCompanies : Company list 
   }

然后

let rec income company =
   company.departments |> List.sumBy (fun d -> d.income }
   + company.subCompanies |> List.sumBy income

当然,你也可以将收入转移到公司(或者也可以在那里加一个) - 我真的不知道你想做什么 - 只是我的5个。