2009-09-26 2 views
9

나는 F 번호에 몇 가지 간단한 코드를 작성하려고 시도하고, 그리고 난이 오류 :가변 변수 'i'가 잘못된 방식으로 사용되었습니다.

Error 1 The mutable variable 'i' is used in an invalid way. Mutable variables may not be captured by closures. Consider eliminating this use of mutation or using a heap-allocated mutable reference cell via 'ref' and '!' 

코드 :

let printProcess = async { 
     let mutable i = 1; 
     while true do 
      System.Console.WriteLine(i);//error is here 
      i <- i + 1; 
    } 

이 왜 나를 변수를 인쇄하지 않습니다?

답변

17

클로저 내부의 mutables를 참조 할 수없고 seq {} 및 async {} 블록과 같은 구문이 포함됩니다.

당신은

let printProcess = async { 
     let i = ref 1 
     while true do 
      System.Console.WriteLine(!i) 
      i := !i + 1 
    } 

일부 논의 this blog를 참조 작성할 수 있습니다.

+6

왜 이렇게해야하는지에 대한 간단한 대답은 '변경 가능'값이 스택에 있고 'ref'값이 힙에 있다는 것입니다. 함수가 종료 할 때마다 스택 프레임이 지워지므로 모든 변경 가능한 값은 회수됩니다. 반면에 Ref 값은 다른 가비지 수집 객체와 마찬가지로 지속됩니다. –

+3

또 다른 방법은 F #이 변수가 아니라 값을 캡처한다는 것입니다. 이 때문에 가변 변수의 값을 캡처하는 것은 불변 변수의 값을 캡처하는 것과 동일합니다. 그 이유는 값 자체가 항상 변경 가능하기 때문입니다. 이 행동은 사람들이 기대하는 것이 아니기 때문에 금지되었습니다. – Joh

관련 문제