F# 统一F中不同来源的(推文/记录类型)#

F# 统一F中不同来源的(推文/记录类型)#,f#,types,F#,Types,我收到来自三个不同来源的推文,每个来源都有或多或少的数据,每个来源都给我一系列记录类型。比如说: type Tweet1 = { id:int64; text:string;} type Tweet2 = { id:int64; text:string; user_name:string} type Tweet3 = { id:int64; text:string; user_name:string; date:DateTime} 如何统一三个序列,seq,seq,seq 我在考虑使用: 一

我收到来自三个不同来源的推文,每个来源都有或多或少的数据,每个来源都给我一系列记录类型。比如说:

type Tweet1 = { id:int64; text:string;}
type Tweet2 = { id:int64; text:string; user_name:string}
type Tweet3 = { id:int64; text:string; user_name:string; date:DateTime}
如何统一三个序列,
seq,seq,seq

我在考虑使用:

  • 一个接口,但当向上转换时,我会丢失数据(而且我似乎无法获得一个记录类型来实现接口)
  • 自动创建一个带有反射的记录类型,除共享的记录类型外,所有proprietes选项类型都是反射的,然后将所有记录类型映射到此记录类型,但这似乎不是很自然
有什么想法吗


谢谢

最简单的选择可能是定义一个包含所有信息的记录,但是那些可能缺少的记录将存储为
选项
值(当信息不可用时,将用
填充):

第一条记录的值将转换为
Tweet(id,text)
,最后一条记录的值将转换为
WithDate(posted,WithUser(user,Tweet(id,text))
。类型
list
的集合可以将普通tweet和带有附加信息的tweet结合起来

在体系结构上,这有点类似于decorator设计模式,因为您可以向基本tweet结构添加其他信息。这可能并不比基本记录更有用,但您可以使用此技巧添加更多的通用性


还可以添加成员以提取属性(使用成员语法)。日期和用户信息可能会返回
选项
选项

您可以使用
Seq.map
将Tweet1和Tweet2记录映射到Tweet3类型,因为这似乎包含“最多”信息。您还可以将
用户名
日期
更改为选项,因为并非所有数据源都提供这些字段。
type Tweet = 
  { id:int64; text:string; 
    user_name:option<string>; date:option<DateTime> }
type TweetInfo = 
  | Tweet of int64 * string
  | WithUser of string * TweetInfo 
  | WithDate of DateTime * TweetInfo