F #-가변 데이터

F #의 변수는 다음과 같습니다. immutable,즉, 변수가 값에 바인딩되면 변경할 수 없습니다. 실제로 정적 읽기 전용 속성으로 컴파일됩니다.

다음 예제는이를 보여줍니다.

let x = 10
let y = 20
let z = x + y

printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z

let x = 15
let y = 20
let z = x + y

printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z

프로그램을 컴파일하고 실행하면 다음과 같은 오류 메시지가 표시됩니다.

Duplicate definition of value 'x'
Duplicate definition of value 'Y'
Duplicate definition of value 'Z'

가변 변수

때때로 변수에 저장된 값을 변경해야합니다. 프로그램의 뒷부분에서 선언되고 할당 된 변수의 값이 변경 될 수 있음을 지정하기 위해 F #은mutable예어. 값을 변경할이 키워드를 사용하여 가변 변수를 선언하고 할당 할 수 있습니다.

그만큼 mutable 키워드를 사용하면 가변 변수에 값을 선언하고 할당 할 수 있습니다.

다음을 사용하여 변경 가능한 변수에 초기 값을 할당 할 수 있습니다. let예어. 그러나 새로운 후속 값을 할당하려면<- 운영자.

예를 들면

let mutable x = 10
x <- 15

다음 예는 개념을 명확하게합니다.

let mutable x = 10
let y = 20
let mutable z = x + y

printfn "Original Values:"
printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z

printfn "Let us change the value of x"
printfn "Value of z will change too."

x <- 15
z <- x + y

printfn "New Values:"
printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z

프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.

Original Values:
x: 10
y: 20
z: 30
Let us change the value of x
Value of z will change too.
New Values:
x: 15
y: 20
z: 35

가변 데이터의 사용

데이터 처리, 특히 레코드 데이터 구조에서 변경 가능한 데이터가 종종 필요하고 사용됩니다. 다음 예제는 이것을 보여줍니다-

open System

type studentData =
   { ID : int;
      mutable IsRegistered : bool;
      mutable RegisteredText : string; }

let getStudent id =
   { ID = id;
      IsRegistered = false;
      RegisteredText = null; }

let registerStudents (students : studentData list) =
   students |> List.iter(fun st ->
      st.IsRegistered <- true
      st.RegisteredText <- sprintf "Registered %s" (DateTime.Now.ToString("hh:mm:ss"))

      Threading.Thread.Sleep(1000) (* Putting thread to sleep for 1 second to simulate processing overhead. *))

let printData (students : studentData list) =
   students |> List.iter (fun x -> printfn "%A" x)

let main() =
   let students = List.init 3 getStudent

   printfn "Before Process:"
   printData students

   printfn "After process:"
   registerStudents students
   printData students

   Console.ReadKey(true) |> ignore

main()

프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.

Before Process:
{ID = 0;
IsRegistered = false;
RegisteredText = null;}
{ID = 1;
IsRegistered = false;
RegisteredText = null;}
{ID = 2;
IsRegistered = false;
RegisteredText = null;}
After process:
{ID = 0;
IsRegistered = true;
RegisteredText = "Registered 05:39:15";}
{ID = 1;
IsRegistered = true;
RegisteredText = "Registered 05:39:16";}
{ID = 2;
IsRegistered = true;
RegisteredText = "Registered 05:39:17";}