Объединение (твиты / типы записей) из разных источников в F # - PullRequest
0 голосов
/ 22 мая 2011

Я получаю твиты из трех разных источников, и у каждого источника есть больше или меньше данных, каждый источник дает мне последовательность типов записей. Допустим,

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>?

Я думал об использовании:

  • интерфейс, но тогда я потеряю данные при обновлении (также я не могу получить тип записи для реализации интерфейса)
  • Автоматическое создание типа записи с помощью Reflection со всеми опциями типа proprietes, за исключением тех, которые являются общими, и затем сопоставление всех типов записей с этим, но это не выглядит очень естественным

Есть идеи?

Спасибо

1 Ответ

2 голосов
/ 22 мая 2011

Вероятно, самый простой вариант - определить запись, которая содержит всю информацию, но те, которые могут отсутствовать, сохраняются как значения option (и будут заполнены None, когда информация недоступна):

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 

Значения из первой записи будут преобразованы в Tweet(id, text), а значенияпоследней записи будет преобразован в WithDate(posted, WithUser(user, Tweet(id, text))).Коллекция типа list<TweetInfo> может комбинировать как простые твиты, так и твиты с дополнительной информацией.

Архитектурно, это немного похоже на шаблон проектирования decorator , поскольку вы можете добавить дополнительныеинформация к основной структуре твита.Это, вероятно, не более полезно, чем базовая запись, но вы можете использовать этот трюк, чтобы добавить больше общности.

Вы также можете добавить члены для извлечения свойств (используя синтаксис члена).Дата и пользовательская информация, вероятно, вернут option<DateTime> и option<string>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...