2015-11-30 65 views
2

我對F#相當陌生,並且正忙於記錄和存儲/排序它們的方式。我現在擁有的就是這樣,它工作的很好......我想。現在看到這是一種功能性第一語言,我想嘗試一下我所做的記錄列表。有沒有辦法訪問記錄中的元素,以便我可以按年齡分類?還是我想這個錯誤的方式F#記錄和列表排序

module RecordTypes = 
    type Student = 
     { 
      Name : string 
      mutable age : int 
      mutable major : string 
     } 

    let studentOne = { Name = "bob" ; age = 20 ; major = "spanish" } 
    let studentTwo= { Name = "sally" ; age = 18 ; major = "english" } 
    let studentThree = { Name = "frank" ; age = 22 ; major = "history" } 
    let studentFour = { Name = "lisa" ; age = 19 ; major = "math" } 
    let studentFive = { Name = "john" ; age = 17 ; major = "philosophy" } 
    // studentFive.age <- studentFive.age + 2 
    let studentList = [studentOne; studentTwo; studentThree ;studentFour; studentFive] 
    studentList |> List.iter (fun s-> printf "Name: %s, Age: %d, Major: %s\n" s.Name s.age s.major) 

let rec findStudent s = 
    match s with 
    | [] -> None 
    | x :: xs -> if studentList.Name then return true else findStudent xs 

回答

3

您可以使用成員訪問:

studentList 
|> List.sortBy (fun s -> s.age) 
|> List.iter (fun s -> printf "Name: %s, Age: %d, Major: %s\n" s.Name s.age s.major) 

或模式匹配(首選IMO):

studentList 
|> List.sortBy (fun { age=a } -> a) 
|> List.iter (fun { Name=n; age=a; major=m } -> printf "Name: %s, Age: %d, Major: %s\n" n a m) 
+0

感謝這確實顯示了對F#的功能方面,但是從我的理解,我可以還使用這種格式的搜索方法呢?只是給用戶一些輸入? – bobEe

+0

@bobEe:你的問題對我來說太模糊了。 – ildjarn

+0

對不起,我的意思是說,我可以做一個搜索函數給定一個名稱迭代認爲記錄列表並返回true或false。我正在考慮像我編輯過的東西aboe – bobEe

2

你可以通過List.sortBy管你的名單做List.iter前:

studentList 
|> List.sortBy (fun s -> s.age) 
|> List.iter (fun s -> printf "Name: %s, Age: %d, Major: %s\n" s.Name s.age s.major) 

正如你所看到的,它需要一個功能用於獲取用於排序的值。通過(fun s -> s.age)將使列表按年齡進行排序。