Вероятно, самый простой вариант - определить запись, которая содержит всю информацию, но те, которые могут отсутствовать, сохраняются как значения 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>
.