在F#联合类型列表上运行

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.显然,我必须以不同的方式处理这些问题.但我不想复制处理类似StateSections每个代码的所有代码.

我的第一个(工作)想法如下:

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为适当的DetailSummary然后使用相同的代码来处理任何一种情况,除了Detail.DivisionsSummary.Office.有没有办法做到这一点?

谢谢.

kvb*_*kvb 6

你可以这样做:

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)