2015-11-30 3 views
2

Je suis relativement nouveau à F # et je me débrouille avec des dossiers et des façons de les stocker/trier. Ce que j'ai maintenant est un ceci, qui fonctionne assez bien ... je pense. Maintenant, en voyant comment c'est une première langue fonctionnelle, je voulais essayer de faire une sorte de sélection de cette liste d'enregistrements que j'ai faits. Y a-t-il un moyen d'accéder aux éléments des documents pour pouvoir trier par âge? ou ce que je pense à ce sujet dans le mauvais sensDossiers F # et tri de la liste

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 

Répondre

3

Vous pouvez utiliser l'accès des membres:

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) 

ou de correspondance de motif (de préférence OMI):

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

Merci cela montre vraiment l'aspect fonctionnel du # F, mais d'après ce que je comprends ce que je pourrais aussi utiliser ce type de format pour une méthode de recherche? juste donné une entrée pour l'utilisateur? – bobEe

+0

@bobEe: Votre question est un peu trop vague pour que je puisse comprendre. – ildjarn

+0

Désolé, ce que je veux dire, c'est que je pourrais faire une fonction de recherche avec un nom qui itère penser la liste des enregistrements et renvoie vrai ou faux. Je pensais quelque chose comme ce que j'ai édité aboe – bobEe

2

Vous pouvez diriger votre liste par List.sortBy avant de faire 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) 

Comme vous pouvez le voir, il faut une fonction à utiliser pour obtenir une valeur utilisée pour le tri. En passant le (fun s -> s.age), la liste sera triée par âge.