如何修复 F# 函数参数中的类型错误

How to fix type error in F# function arguments

我有一个程序试图接受一个整数列表和 return 一个包含所有奇数的整数列表,我是函数式编程的新手,正在尝试学习它与 F#。当我尝试在 main 中调用 removeEvens 时,它给了我这个错误

Error   FS0001  This expression was expected to have type
    'int list -> 'a'    
but here has type
    ''b list'

这是我的代码

open System

let rec removeEvens arr count ret =
    if count < 0 then
        ret
    else
        if count % 2 = 0 then
            removeEvens arr (count + 1) ret
        else
            removeEvens arr (count + 1) (arr[count] :: ret)

let rec printResults arr count =
    if count > 0 then
        printfn "%d" (arr[count])
        printResults arr (count + 1)


[<EntryPoint>]
let main argv =
    printResults (removeEvens [0 .. 100] 0 []) 0
    0

在语法上,这里唯一的问题是索引运算符缺少一个 . 字符。因此,您需要 arr.[count] 而不是 arr[count] (F# 编译器认为这是将名为 arr 的函数应用于单例列表,因此会出现编译器错误)。为了使用索引,您还需要将 arr 值显式注释为列表,如下所示:(arr : List<_>).

从语义上讲,您应该知道以这种方式对列表进行索引是低效的,但这是一个单独的问题。相反,我建议从列表中删除偶数的更优雅的方法是只考虑递归函数中列表的头元素。