Seq {/ * yielding sth * /}:可变变量出错

时间:2011-10-20 00:54:34

标签: f#

我正在尝试学习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'!'。

有人可以帮我解决这个问题吗? 或者至少给我英文版的错误?

谢谢!

2 个答案:

答案 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'和'!'来消除这种突变的使用或使用堆分配的可变参考单元。