2017-10-17 9 views
2

Je suis nouveau à F # et je fais un programme qui nécessite de trouver chaque sous-liste de longueur donnée d'une liste. Je n'étais pas sûr de savoir comment s'y prendre alors j'ai lu this question et j'ai décidé de porter la réponse à F #. Voici ce que j'ai:Comment travailler avec des listes mutables en F #?

let rec getSubLists (len : int) (list : List<int>) : List<List<int>> = 
    let result = new List<List<int>>() 
    let current = new List<int>() 

    let rec findSubLists (len : int) (superSet : List<int>) (current : List<int>) (soln : List<List<int>>) (idx : int) : unit = 
    if current.Length = len then soln.Insert(len - 1, current) 
    elif idx = superSet.Length then 
     let x = superSet.[idx] 
     current.Insert(len, x) 
     findSubLists len superSet current soln (idx + 1) 
     current.RemoveAt(x) 
     findSubLists len superSet current soln (idx + 1) 
    else() 

    findSubLists len list current result 0 
    result 

Le compilateur est bouleversé quelques choses: il dit qu'il n'y a pas de constructeur pour List<int>, List<List<int>>, et il est dit que Insert et RemoveAt ne sont pas définis. J'ai trouvé ces méthodes dans le microsoft docs. This tutorial mentionne RemoveAt, mais il utilise Add au lieu de Insert, qui ne fonctionnait pas non plus.

Répondre

5

En F # le type List<'t> est la liste F # immuable. Ce n'est pas la même chose que System.Collections.Generic.List<T>, qui est ce qui est décrit dans les documents que vous avez liés. Pour accéder à ce dernier, ouvrez l'espace de noms System.Collections.Generic (mais attention: ceci ombrera la liste F # normale) ou faites-y référence par son alias F #, ResizeArray<'t>, qui exprime également mieux sa vraie nature.

let rec getSubLists (len : int) (list : ResizeArray<int>) : ResizeArray<ResizeArray<int>> = 
    let result = new ResizeArray<ResizeArray<int>>() 
    let current = new ResizeArray<int>() 

    let rec findSubLists (len : int) (superSet : ResizeArray<int>) (current : ResizeArray<int>) (soln : ResizeArray<ResizeArray<int>>) (idx : int) : unit = 
    if current.Count = len then soln.Insert(len - 1, current) 
    elif idx = superSet.Count then 
     let x = superSet.[idx] 
     current.Insert(len, x) 
     findSubLists len superSet current soln (idx + 1) 
     current.RemoveAt(x) 
     findSubLists len superSet current soln (idx + 1) 
    else() 

    findSubLists len list current result 0 
    result 

(noter aussi qu'il est Count, pas Length)