这个表达式预计有'unit'类型,但这里有''a []'类型

Luk*_*uke 3 f#

下面的代码试图在F#中进行递归冒泡排序,我收到了错误

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

对于中间三行:

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
Run Code Online (Sandbox Code Playgroud)

这真让我感到困惑,因为我发现的所有资源都没有充分解释或暗示为什么会发生这种情况.任何帮助都会有很大的帮助.

Gus*_*Gus 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
Run Code Online (Sandbox Code Playgroud)

所以,elif你写的最后一个必须是一个else,其中else有另一个if检查是否执行交换.

所有if.. then,包括elif或不包括,必须以elsea 结尾,除非它是一个unit表达式(作为调用swap).

这就是你得到这个错误的原因.

最后请注意,您的比较是反转的,您将按降序对列表进行排序.