繁体   English   中英

联盟类型的F#列表

[英]F# List of Union Types

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

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

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

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

谢谢。

你的语法有点错误:

type Report = Detail of Detail | Summary of Summary

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

在您的代码中,您基本上只是将Report类型定义为具有两个可能值的DetailsSummary的枚举(这些值类似于标签,而不是此上下文中不同子类型的类型)。 F#中的歧视联合会被明确标记,因此您还必须使用其中一个联合构造函数来创建要放入列表的实例。

您需要将Report类型更改为:

type Report = Detail of Detail | Summary of Summary

由于您当前的定义只是为您的报告类型命名两个案例,因此这些名称与现有的DetailSummary类型无关。

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

let details = reports |> List.choose (function Detail(d) -> Some(d) | _ -> None)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM