2015-11-30 6 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) 

или шаблон соответствия (предпочтительный ИМО):

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), список будет отсортирован по возрасту.