我想要一份报告清单。报告可以是详细信息或部分类型。
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
编译器在第一种情况下抱怨:“表达式应该具有类型Report但是这里有类型Detail”,并且在第二种情况下也是如此。
我是不是想出这样的事情?我应该以不同的方式思考问题吗?由于报表是详细信息或摘要,因此报表列表不应接受详细信息或摘要?什么是报告列表,如果不是详细信息或摘要列表?
感谢。
答案 0 :(得分:6)
你的语法有点错误:
type Report = Detail of Detail | Summary of Summary
reports <- (Detail detail)::reports
// or
reports <- (Summary summary)::reports
在您的代码中,您基本上只是将Report
类型定义为具有两个可能值Details
或Summary
的枚举(这些类似于标签,而不是不同的类型)在这种情况下的子类型)。 F#中的歧视联合会被明确标记,因此您还必须使用其中一个联合构造函数来创建要放入列表的实例。
答案 1 :(得分:3)
您需要将Report
类型更改为:
type Report = Detail of Detail | Summary of Summary
因为您当前的定义只是为报告类型的两种情况命名,而这些名称与现有的Detail
和Summary
类型无关。
然后,您可以使用Detail
过滤Summary
和List.choose
元素,例如
let details = reports |> List.choose (function Detail(d) -> Some(d) | _ -> None)