如果你在談論指定記錄的值,因爲它們變得可用,那麼你需要做記錄option
這樣的領域,你可以代表一個事實,即值缺失。我會用一成不變的記錄,因爲這是在實用的風格較爲常見:
type Employee = { Name:option<string>; ID:option<string> }
現在你可以創建一個只ID記錄,並在用戶進入其添加名稱:
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 Chapter 12(PDF)現實世界的函數式編程)。如果您的用戶交互涉及等待事件(例如鼠標點擊),那麼您仍然可以使用此樣式,但是您需要將所有內容都包含在異步工作流程中並使用Async.AwaitEvent
。
你好先生,非常感謝你的答案。你能再幫我一次嗎?我仍然是F#的新手。如果使用你的代碼,這意味着名稱值應該是一些字符串,是否正確?你能給我建議先生嗎?如何學習這門語言,因爲我試圖通過編寫書本的例子來學習,但是當我想寫一些應用程序時,我以類似於命令式語言的代碼結束了代碼,然後最終我對這個概念感到困惑語言。我有點沮喪在這裏:) – 2011-03-13 05:51:18