2014-10-12 48 views
0

所以即時嘗試製作一個公司作爲公司的分支和子公司作爲樹葉。 每個公司/子公司都包含名稱,總收入和與子公司的列表。檢索從分支到葉的匹配值

我做了一個函數,爲公司樹中的所有公司/子公司返回一個元組(名稱,總收入)。

我現在想要做的是找到某個公司/子公司的總收入,這意味着該功能應該將所有子公司總收入與公司一起添加並返回結果。它應該只有一個字符串作爲輸入(公司的名稱)。

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

總結了一切你可以做這樣的事情(不知道爲什麼你在這裏需要公司的名稱,就像你剛剛總結的那樣):

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 
當然

您可以將收入到公司也一樣(或者在那裏添加一個) - 我真的不知道你想做什麼 - 只是我的5cts。

+0

我把公司列爲部門,因爲我認爲它會更有意義。但是,你會建議什麼? – Anonymous 2014-10-12 13:46:46

+0

而我在我的輸入中有這個名字,因爲如果我想爲「Lurpak」找到總收入,那麼它應該採用所有分支和葉子,但僅限於Lurpak – Anonymous 2014-10-12 13:54:14

+0

對於第二個:然後首先搜索子樹Lurpak,然後做recursiv總和 - 爲你的第一:我無法弄清楚你想要做什麼,但我會說一個部門有一個名稱和收入,公司有一個部門名單和子公司名單,而不是 – Carsten 2014-10-12 13:56:22