2017-01-28 2 views
3

Der folgende Code war der Versuch einer rekursiven Blase Art in F #, wo ich den Fehler empfangenDieser Ausdruck wurde erwartet, Typ ‚Einheit‘ haben, aber hier hat Typ ‚‘ a []‘

"This expression was expected to have type 'unit' but here has type ''a []'"

für die mittleren drei Linien:

let swap i j (arr : 'a []) = 
    let tmp = arr.[i] 
    arr.[i] <- arr.[j] 
    arr.[j] <- tmp 

let rec recursiveBubbleSort i j (sequence : 'a []) = 
    if i = sequence.Length then sequence //error 
    elif j = sequence.Length then recursiveBubbleSort (i+1) 0 sequence //error 
    elif sequence.[i] > sequence.[j] then swap i j sequence //error 
    recursiveBubbleSort i (j+1) sequence 

Das ist wirklich verwirrend mich, da alle Ressourcen, die ich gefunden habe nicht ausreichend erklärt oder impliziert, warum dies tatsächlich auftritt. Jede Hilfe würde sehr geschätzt werden.

Antwort

5

Ich denke, das ist das, was Sie schreiben wollte:

let rec recursiveBubbleSort i j (sequence : 'a []) = 
    if i = sequence.Length then sequence 
    elif j = sequence.Length then recursiveBubbleSort (i+1) 0 sequence 
    else 
     if sequence.[i] > sequence.[j] then swap i j sequence |> ignore 
     recursiveBubbleSort i (j+1) sequence 

So, der letzte elif Sie hat schrieb ein else sein, innerhalb dieser else es eine andere if ist, die nicht überprüft, ob die Swap durchführen oder .

Alle if .. then, einschließlich elif oder nicht, muss mit einem else beenden, es sei denn, es ist ein unit Ausdruck (als Aufruf an swap).

Deshalb haben Sie diesen Fehler bekommen.

Beachten Sie, dass Ihr Vergleich invertiert ist, sortieren Sie die Liste in absteigender Reihenfolge.

+0

Ausgezeichnet - Sie Legende! Vielen Dank! – Luke

Verwandte Themen