2017-01-28 3 views
3

次のコードは、私がこの式は、型「ユニット」を持つことが期待されたが、ここでは「[]」

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

エラーを受け取ったF#で再帰的なバブルソートの試みであった」と入力しています真ん中の3ライン分の

:私が見つけたすべてのリソースが十分に説明したり、これは実際に発生している理由を暗示していないよう

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 

これは本当に、私を困惑されます。どんな助けでも大いに役立つでしょう。

答えて

5

私は、これはあなたが書きたかった何だと思う:

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 

だから、あなたが書いた最後のelifelseにする必要があり、そのelse内スワップを実行するかどうかをチェックする別のifがあります。それは(swapへの呼び出しなど)unit表現でない限り

elifかを含め、すべてのif ... thenは、elseで終わらなければなりません。

だからこそ、あなたはそのエラーを受けていました。

最後に、比較が逆であることに注意してください。リストを降順でソートします。

+0

優秀 - 伝説です!ありがとう! – Luke

関連する問題