2012-12-07 159 views
4

我想要一個報告列表。報告可以是詳細信息或部門類型。F#聯盟類型列表

module Data 

type Section = { Header: string; 
       Lines: string list; 
       Total: string } 

type Detail = { State:  string; 
       Divisions: string list; 
       Sections: Section list } 

type Summary = { State: string; 
       Office: string; 
       Sections: Section list } 

type Report = Detail | Summary 

然後在我的代碼,我想做到以下幾點:

let mutable (reports:Report list) = [] 

... 

reports <- detail::reports 
// or 
reports <- summary::reports 

編譯器會抱怨在第一種情況:「預期的表達有類型的報告,但這裏有類型詳細信息「,並在第二種情況下適當地類似。

我是不是想要做這樣的事情?我應該以不同的方式思考問題嗎?由於「報告」是「明細」或「摘要」,報告列表是否應接受「明細」或「摘要」?如果不是詳細信息或摘要列表,報告列表是什麼?

謝謝。

回答

5

你拿到你的語法有點不對勁:

type Report = Detail of Detail | Summary of Summary 

reports <- (Detail detail)::reports 
// or 
reports <- (Summary summary)::reports 

在你的代碼已經基本上只是定義了Report型爲與兩個可能的值DetailsSummary枚舉(這是像標籤,而不是此上下文中不同子類型的類型)。 F#中的歧視聯合會被明確標記,因此您還必須使用聯合構造函數之一來創建要放入列表的實例。

+0

完美!非常感謝! –

3

您需要將Report類型更改爲:

type Report = Detail of Detail | Summary of Summary 

,因爲你目前的定義只是名稱的報告類型的兩種情況,而且這些名稱不涉及到現有DetailSummary類型。

然後,您可以使用List.choose來過濾DetailSummary元素,例如,

let details = reports |> List.choose (function Detail(d) -> Some(d) | _ -> None) 
+0

謝謝!我將進一步需要它進入我的項目。 :) –