2012-12-07 144 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

谢谢!我将进一步需要它进入我的项目。 :) –