Jef*_*ner 4 f# list discriminated-union
这是我在F#联盟类型列表中的问题的延续.感谢有用的反馈,我能够创建一个Reports 列表,其中Report包含Detail或者Summary.这是数据定义了:
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 of Detail | Summary of Summary
Run Code Online (Sandbox Code Playgroud)
现在我已经Report在一个名为的变量中得到了s 列表reports,我想迭代这些Report对象并根据每个对象执行操作.除了处理任何一个Detail.Divisions或两个的情况外,操作是相同的Summary.Office.显然,我必须以不同的方式处理这些问题.但我不想复制处理类似State和Sections每个代码的所有代码.
我的第一个(工作)想法如下:
for report in reports do
let mutable isDetail = false
let mutable isSummary = false
match report with
| Detail _ -> isDetail <- true
| Summary _ -> isSummary <- true
...
Run Code Online (Sandbox Code Playgroud)
这将让我知道何时处理Detail.Divisions而不是Summary.Office.但它并没有给我一个可以使用的对象.我仍然坚持report,不知道它是什么,Detail或者Summary,也无法访问属性.我想转换report为适当的Detail或Summary然后使用相同的代码来处理任何一种情况,除了Detail.Divisions和Summary.Office.有没有办法做到这一点?
谢谢.
你可以这样做:
for report in reports do
match report with
| Detail { State = s; Sections = l }
| Summary { State = s; Sections = l } ->
// common processing for state and sections (using bound identifiers s and l)
match report with
| Detail { Divisions = l } ->
// unique processing for divisions
| Summary { Office = o } ->
// unique processing for office
Run Code Online (Sandbox Code Playgroud)