2011-05-22 37 views
0

我從三個不同來源獲取推文,每個來源都有或多或少的數據,每個來源都給我一個記錄類型的序列。比方說:F#中來自不同來源的統一(tweets/recordtypes)

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<Tweet1>, seq<Tweet2>, seq<Tweet3>

我想使用:

  • 一個接口,但再上溯造型時,我西港島線丟失數據(我也不能似乎得到一個記錄類型來實施intertface)
  • 創建automaticaly有記錄類型反射與所有proprietes選項類型,除了那些共享,然後映射所有記錄類型到這一個,但這似乎並不很自然

任何想法?

感謝

+1

您可以使用'Seq.map'將Tweet1和Tweet2記錄映射到Tweet3類型,因爲它似乎保存了「最」信息。 – vcsjones 2011-05-22 16:53:46

+1

您還可以將'user_name'和'date'更改爲Options,因爲並非所有數據源都提供這些字段。 – 2011-05-22 17:42:52

回答

2

也許最簡單的方法是定義一個包含所有信息的記錄,但那些可能會丟失存儲爲option值(和將充滿None當信息不可用):

type Tweet = 
    { id:int64; text:string; 
    user_name:option<string>; date:option<DateTime> } 

我能想到的另一種方法是使用數據結構像這樣來存儲有關的tweet信息:

type TweetInfo = 
    | Tweet of int64 * string 
    | WithUser of string * TweetInfo 
    | WithDate of DateTime * TweetInfo 

第一條記錄的值將變爲Tweet(id, text),最後一條記錄的值將變爲WithDate(posted, WithUser(user, Tweet(id, text)))list<TweetInfo>類型的集合可以將普通推文和推文與其他信息結合起來。

從結構上看,這與設計模式有點相似,因爲您可以將其他信息添加到基本推文結構中。這可能不是基本記錄更有用,但你可以使用這個技巧來增加更多的通用性。

您還可以添加成員以提取屬性(使用成員語法)。日期和用戶信息可能會返回option<DateTime>option<string>

相關問題