f# - 此表达式的类型应为 'unit',但此处的类型为 '' a []'

标签 f#

以下代码尝试在 F# 中进行递归冒泡排序,但我收到了错误

“这个表达式的类型应该是‘unit’,但这里的类型是‘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

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

最佳答案

我想这就是你想写的:

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 检查是否执行交换。

所有 if .. then,包括 elif 或不包括,都必须以 else 结尾,除非它是unit 表达式(作为对 swap 的调用)。

这就是您收到该错误的原因。

最后注意你的比较是倒序的,你会按降序排列列表。

关于f# - 此表达式的类型应为 'unit',但此处的类型为 '' a []',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915802/

相关文章:

F# Seq.head & Seq.tail 类型与自定义类型不匹配

F#如何传递等效的接口(interface)

list - 如何使这些简单的函数在 f# 中尾递归

.net - System.Console.WriteLine() 与 F# 中的 printfn

list - F# 使用 set.fold 设置为列表

haskell - 是否有等效于 F# 测量单位的 Haskell?

c# - f# 读取 xls 文件 - 如何解析 value2 对象

f# - 在 F# 树上并行化函数的选项

arrays - 有没有一种简单的方法可以在 Fsharp 中将 byte [] 转换为 ReadOnlySpan<byte> ?

f# - 在不同的泛型实例中实现相同的接口(interface)