我正在尝试学习F#(我是一名C#开发人员),在尝试编译以下代码时遇到了我的第一个问题:
let decompose n =
seq{
let mutable c = n
let mutable i = 2L
if c%2L=0L then
c <- c/2L
yield 2L
if (c=1L) then yield 1L
else
while c<>1L do
if c % i=0L then
c<-c/i
yield i
else i <- i+2L
}
我尝试了google编译错误(见下文),但未成功(可能是因为它是法语版):
La variablemutable'c'estutiliséedemanièreincorrecte。不可能的de capturer les变量可变的l'aide de fermetures。 Supprimez cette utilization de la mutation ou utilisez une cellulederéférencemutableallouéepartas via'ref'et'!'。
有人可以帮我解决这个问题吗? 或者至少给我英文版的错误?
谢谢!
答案 0 :(得分:3)
好的... StackOverflow设计得非常好:我在以下帖子中找到了答案(在“相关”栏中找到):
The mutable variable 'i' is used in an invalid way.?
我不会删除那些将谷歌此错误的法国人的问题!
BTW,这是工作代码:
let decompose n =
seq{
let c = ref 0L
c := n
let i = ref 3L
if !c%2L=0L then
c := !c / 2L
yield 2L
if (!c=1L) then yield 1L
else
while !c<>1L do
if !c % !i=0L then
c:= !c / !i
yield !i
else i := !i+2L
}
// returns [|3;41|]
let dec = decompose 123L |> Seq.ToArray
答案 1 :(得分:0)
为了回答你问题的另一半,该编译器消息的英文版是:
可变变量'c'以无效方式使用。闭包不能捕获可变变量。考虑通过'ref'和'!'来消除这种突变的使用或使用堆分配的可变参考单元。