2017-10-17 3 views
2

Ich bin neu in F # und ich mache ein Programm, das erfordert, jede Unterliste bestimmter Länge einer Liste zu finden. Ich war mir nicht sicher, wie ich das anstellen sollte, also habe ich this question gelesen und beschlossen, die Antwort auf F # zu portieren. Hier ist, was ich habe:Wie man mit veränderbaren Listen in F # arbeitet?

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 

Der Compiler ist verärgert über ein paar Dinge: es sagt, es gibt keinen Konstruktor für List<int>, List<List<int>>, und sie sagt, dass Insert und RemoveAt sind nicht definiert. Ich habe diese Methoden in der microsoft docs gefunden. This tutorial erwähnt RemoveAt, aber es verwendet Add anstelle von Insert, die auch nicht funktioniert.

Antwort

5

In F # ist der Typ List<'t> die unveränderliche F # -Liste. Es ist nicht dasselbe wie System.Collections.Generic.List<T>, was in den Dokumenten beschrieben ist, die Sie verlinkt haben.

Um auf Letzteres zuzugreifen, öffnen Sie entweder den Namespace System.Collections.Generic (aber Vorsicht: dies wird die normale F # -Liste überschatten) oder verweisen Sie auf seinen F # -Alias, ResizeArray<'t>, der auch seine wahre Natur besser ausdrückt.

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 

(beachten Sie auch, dass es Count ist, nicht Length)