수색…


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 유형은 여기서 "입력 없음"을 나타내는 데 중요합니다. 함수에는 이미 입력해야하는 모든 정보가 있으며 호출자는이를 변경할 수 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow