函数返回类型 unit 而不是类型 ref
Function returning type unit instead of type ref
这里我尝试使用命令式阶乘函数,但尽管函数的最后一行声明要返回 ref
,fsc 告诉我该函数正在返回一个单位。我知道不允许返回可变变量,但我认为您可以使用 ref
?另外,请不要告诉我以功能方式重写它。我知道这是另一种选择,但我正在努力更好地了解命令式编程在该语言中的工作原理。
这是我的程序:
let factorial n = do
let res = ref 1
for i = 2 to n do
res := !res * i
res
[<EntryPoint>]
let main(args : string[]) =
let result = factorial 10
printfn "%d" !result
这是编译器给我的:
factorial.fs(2,5): warning FS0020: This expression should have type 'unit', but
has type 'int ref'. Use 'ignore' to discard the result of the expression,
or 'let' to bind the result to a name.
factorial.fs(10,13): error FS0001: Type mismatch. Expecting a
'a -> int
but given a
'a -> unit
The type 'int' does not match the type 'unit'
factorial.fs(10,19): error FS0001: This expression was expected to have type
'a ref
but here has type
unit
您需要做的就是删除 do
,在此上下文中使用的 do
专门用于执行 side-effects,因此是预期的 return 类型的单元。
还有,你的函数不对,需要把循环中的n
换成i
。
let factorial n =
let res = ref 1
for i = 2 to n do
res := !res * i
res
对了,不用引用,直接这样写就可以了:
let factorial n =
let mutable res = 1
for i = 2 to n do
res <- res * i
res
这里我尝试使用命令式阶乘函数,但尽管函数的最后一行声明要返回 ref
,fsc 告诉我该函数正在返回一个单位。我知道不允许返回可变变量,但我认为您可以使用 ref
?另外,请不要告诉我以功能方式重写它。我知道这是另一种选择,但我正在努力更好地了解命令式编程在该语言中的工作原理。
这是我的程序:
let factorial n = do
let res = ref 1
for i = 2 to n do
res := !res * i
res
[<EntryPoint>]
let main(args : string[]) =
let result = factorial 10
printfn "%d" !result
这是编译器给我的:
factorial.fs(2,5): warning FS0020: This expression should have type 'unit', but
has type 'int ref'. Use 'ignore' to discard the result of the expression,
or 'let' to bind the result to a name.
factorial.fs(10,13): error FS0001: Type mismatch. Expecting a
'a -> int
but given a
'a -> unit
The type 'int' does not match the type 'unit'
factorial.fs(10,19): error FS0001: This expression was expected to have type
'a ref
but here has type
unit
您需要做的就是删除 do
,在此上下文中使用的 do
专门用于执行 side-effects,因此是预期的 return 类型的单元。
还有,你的函数不对,需要把循环中的n
换成i
。
let factorial n =
let res = ref 1
for i = 2 to n do
res := !res * i
res
对了,不用引用,直接这样写就可以了:
let factorial n =
let mutable res = 1
for i = 2 to n do
res <- res * i
res