2011-03-11 69 views
1

有人可以給我一個如何使插入數據到F#記錄更靈活的例子嗎?我可以使記錄更靈活嗎?

我使用的記錄,像這樣的例子經常看到:

type Employee = {mutable name:string; mutable id:string} 

let data = 
    [{name = "Thomas";id = "000"}; 
    {name = "Johny";id = "001"}; 
    {name = "Lucky";id = "002"}; 
    {name = "Don";id = "003"} 
    ] 

我們不能開始根本沒有數據,並將數據插入到記錄以後呢?

(我的意思是不一樣的例子中,數據的價值的聲明,因此,例如:該程序正在運行,要求我們插入數據)

我們可以做這樣的事情了創紀錄?

回答

4

如果你在談論指定記錄的值,因爲它們變得可用,那麼你需要做記錄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

+0

你好先生,非常感謝你的答案。你能再幫我一次嗎?我仍然是F#的新手。如果使用你的代碼,這意味着名稱值應該是一些字符串,是否正確?你能給我建議先生嗎?如何學習這門語言,因爲我試圖通過編寫書本的例子來學習,但是當我想寫一些應用程序時,我以類似於命令式語言的代碼結束了代碼,然後最終我對這個概念感到困惑語言。我有點沮喪在這裏:) – 2011-03-13 05:51:18

1

你看到你經常看到這樣的例子嗎?

我想說在F#中使用mutash記錄不是很習慣。

Immutability是一個相當大的主題 在這裏一個答案來解釋,但 簡述:不變性意味着用戶可創建的 對象永遠不會改變: 他們留他們在 創作的方式。在不可改變的世界裏,當你想'改變'一些東西時,你會創建一個新的東西,然後扔掉舊的那個東西 。

無論如何,如果我正確理解你的問題,你實際上是在談論變異data,而不是記錄。所以,你可以有:

let data = [] 
let data = {name = "Thomas";id = "000"} :: data 
let data = {{name = "Johny";id = "001"} :: data 

但是在這種情況下,你是不是真的「改變」的數據,你每次只需創建一個新的列表,並指向它的數據。

+0

謝謝,是的,我已經知道使用你的代碼它不會改變數據。我只想編寫簡單的應用程序,例如我用C++編寫,存儲數據,刪除數據,搜索數據以及查看數據。在C++中,我使用數組,這很容易..我只是試圖使用這個簡單的應用程序record..but但我發現它很難 – 2011-03-13 06:00:05

相關問題