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

时间:2017-01-28 22:58:03

标签: 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

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

1 个答案:

答案 0 :(得分: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

因此,您编写的最后一个elif必须是else,在else内,还有另一个if检查是否执行交换。< / p>

所有if .. then,包括elif,必须以else结尾,除非它是unit表达式(作为致电swap)。

这就是你收到错误的原因。

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