Если вы говорите об указании значений записи по мере того, как они становятся доступными, то вам нужно сделать поля записи option
, чтобы вы могли представить факт, что значение отсутствует.Я буду использовать неизменяемые записи, потому что это чаще встречается в функциональном стиле:
type Employee = { Name:option<string>; ID:option<string> }
Теперь вы можете создать запись только с идентификатором и добавить имя, когда пользователь вводит ее:
let empty = { Name = None; ID = Some 123 }
let name = // read name from user
let full = { empty with Name = name }
Если вы говорите о добавлении элементов в список по мере их появления, у вас есть несколько вариантов.Прямым является написание рекурсивной функции, которая многократно читает записи и создает список:
let rec readData i records =
let name = // read name from user
if name <> "" then
// Create new record and add it to our list
let itm = { Name = name; ID = string i }
readData (i + 1) (itm::records)
else
// Return records that we collected so far in the right order
records |> List.rev
В качестве альтернативы вы также можете использовать выражения последовательности (см., Например, free Глава 12 (PDF) реального функционального программирования).Если ваше взаимодействие с пользователем предполагает ожидание событий (например, щелчок мышью), тогда вы все равно можете использовать этот стиль, но вам нужно обернуть все в асинхронный рабочий процесс и использовать Async.AwaitEvent
.