5

我想要一份报告清单。报告可以是详细信息或部分类型。

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

编译器在第一种情况下抱怨:“表达式应该具有报告类型,但这里有详细类型”,并且在第二种情况下适当地类似。

我是不是因为想做这样的事情而发疯了?我应该以不同的方式思考这个问题吗?因为报告是详细信息或摘要,报告列表不应该接受详细信息或摘要吗?如果不是详细信息或摘要列表,那么报告列表是什么?

谢谢。

4

2 回答 2

7

你的语法有点错误:

type Report = Detail of Detail | Summary of Summary

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

在您的代码中,您基本上只是将Report类型定义为具有两个可能值的枚举,Details或者Summary(这些就像标签,而不是在这种情况下不同子类型的类型)。F# 中的可区分联合是显式标记的,因此您还必须使用联合构造函数之一来创建要放入列表的实例。

于 2012-12-07T21:13:27.950 回答
3

您需要将Report类型更改为:

type Report = Detail of Detail | Summary of Summary

因为您当前的定义只是命名了 Report 类型的两种情况,而这些名称与现有的DetailSummary类型无关。

然后,您可以使用例如过滤DetailandSummary元素List.choose

let details = reports |> List.choose (function Detail(d) -> Some(d) | _ -> None)
于 2012-12-07T21:17:07.710 回答