수색…
0-tuple은 무엇이 좋은가요?
2- 튜플 또는 3- 튜플은 관련 항목 그룹을 나타냅니다. (2D 공간의 점, 색상의 RGB 값 등) 1 튜플은 단일 int
로 쉽게 대체 될 수 있으므로별로 유용하지 않습니다.
0- 튜플은 절대적으로 아무것도 포함하고 있지 않기 때문에 더 쓸모없는 것처럼 보입니다. 그러나 F #과 같은 기능 언어에서 매우 유용하게 사용할 수있는 속성이 있습니다. 예를 들어, 0- 튜플 유형은 정확히 하나의 값을 가지며, 일반적으로 ()
로 표시됩니다. 모든 0 튜플은이 값을 가지므로 기본적으로 싱글 톤 유형입니다. F #을 포함한 대부분의 함수형 프로그래밍 언어에서이를 unit
유형이라고 부릅니다.
C #에서 void
를 반환하는 함수는 F #의 unit
유형을 반환합니다.
let printResult = printfn "Hello"
F # 인터프리터 인터프리터에서 실행하면 다음과 같이 표시됩니다.
val printResult : unit = ()
즉, printResult
값은 unit
유형이며 값 ()
(빈 유형, unit
유형의 유일한 값)을 가짐을 의미합니다.
함수는 unit
유형을 매개 변수로 사용할 수도 있습니다. F #에서는 함수가 매개 변수를 사용하지 않는 것처럼 보일 수 있습니다. 그러나 실제로, 그들은 unit
유형의 단일 매개 변수를 취하고 있습니다. 이 기능은 다음과 같습니다.
let doMath() = 2 + 4
실제로는 다음과 같습니다.
let doMath () = 2 + 4
즉, unit
유형의 하나의 매개 변수를 사용하고 int
값을 반환하는 함수입니다.이 함수를 정의 할 때 F # 대화 형 인터프리터가 인쇄하는 유형 시그니처를 보면 다음과 같은 내용을 볼 수 있습니다.
val doMath : unit -> int
모든 함수가 적어도 하나의 매개 변수를 가져 와서 값을 반환한다는 사실은 그 값이 ()
와 같이 "쓸모없는"값인 경우에도 F #에서는 함수 합성이 훨씬 쉽지만 unit
유형. 그러나 그것은 우리가 나중에 얻을 수있는보다 진보 된 주제입니다. 지금, 당신이 볼 때 기억 unit
함수 서명, 또는에서 ()
함수의 매개 변수, 즉 방법 역할을 0 튜플 타입의 "이 기능은 반환, 의미있는 값을 사용하거나."
코드 실행 연기
나중에 사용할 때까지 실행하지 않으려는 함수를 정의하기 위해 unit
형식을 함수 인수로 사용할 수 있습니다. 이것은 주로 비동기 백그라운드 작업에서 유용합니다. 주 스레드가 백그라운드 스레드의 미리 정의 된 기능을 트리거 할 수 있습니다 (예 : 새 파일로 이동하거나 let-binding을 즉시 실행하지 않아야하는 경우).
module Time =
let now = System.DateTime.Now // value is set and fixed for duration of program
let now() = System.DateTime.Now // value is calculated when function is called (each time)
다음 코드에서는 작업자가 2 초마다 작업하고있는 값을 출력하는 코드를 정의합니다. 그런 다음 작업자는 작업을 수행 할 다음 값으로 이동하는 작업과 작업을 중지하는 작업을 제어하는 데 사용할 수있는 두 가지 기능을 반환합니다. 이들은 기능이되어야합니다. 왜냐하면 우리가 선택할 때까지는 시체가 실행되기를 원하지 않기 때문입니다. 그렇지 않으면 작업자는 즉시 두 번째 값으로 이동하고 아무 것도하지 않고 종료합니다.
let startWorker value =
let current = ref value
let stop = ref false
let nextValue () = current := !current + 1
let stopOnNextTick () = stop := true
let rec loop () = async {
if !stop then
printfn "Stopping work."
return ()
else
printfn "Working on %d." !current
do! Async.Sleep 2000
return! loop () }
Async.Start (loop ())
nextValue, stopOnNextTick
우리는 다음을 수행함으로써 노동자를 시작할 수 있습니다.
let nextValue, stopOnNextTick = startWorker 12
작업이 시작됩니다 - 우리가 F # interactive 인 경우, 2 초마다 콘솔에 출력 된 메시지를 볼 수 있습니다. 그러면 우리는
nextValue ()
작업중인 가치가 다음 값으로 이동했다는 메시지가 표시됩니다.
작업을 마칠 때가되면
stopOnNextTick ()
함수는 닫는 메시지를 출력하고 종료합니다.
unit
유형은 여기서 "입력 없음"을 나타내는 데 중요합니다. 함수에는 이미 입력해야하는 모든 정보가 있으며 호출자는이를 변경할 수 없습니다.