如何修复 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<_>)
.
从语义上讲,您应该知道以这种方式对列表进行索引是低效的,但这是一个单独的问题。相反,我建议从列表中删除偶数的更优雅的方法是只考虑递归函数中列表的头元素。
我有一个程序试图接受一个整数列表和 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<_>)
.
从语义上讲,您应该知道以这种方式对列表进行索引是低效的,但这是一个单独的问题。相反,我建议从列表中删除偶数的更优雅的方法是只考虑递归函数中列表的头元素。