일부 로컬 상태를 사용하여 빌드하는 코드를 작성하려고합니다. 그렇게하지 있도록 makeThings 내부 s
상태 매개 변수가 암시 적 콜백 것을 만들 수있는 방법이 있는지 궁금 해요OCaml에서 암시 적 로컬 상태를 수행하는 관용적 인 방법이 있습니까?
type state = int ref
let uniqueId : (state -> int) =
fun s -> incr s; !s
let makeThings : ((state -> 'a) -> 'a) =
fun body -> body (ref 0)
let() =
let x1 = makeThings(fun s ->
let i = uniqueId s in (* 1 *)
i
) in
print_int x1; print_newline(); (* Prints 1 *)
(* Each makeThings callback gets its own local state.
The ids start being generated from 1 again *)
let x2 = makeThings(fun s ->
let i = uniqueId s in (* 1 *)
let j = uniqueId s in (* 2 *)
i + j
) in
print_int x2; print_newline(); (* Prints 3 *)
()
예를 들어, 순차적 인 정수를 생성하기 위해 로컬 상태를 사용하는 다음 코드를 살펴 반복해서 입력해야하므로 모든 uniqueId
호출에 동일한 상태 매개 변수가 전달되도록 보장해야합니다. 예를 들어, 하스켈에서 당신은 모나드를 사용할 수 있고 할 표기법을 OCaml의에서
makeThings $ do
i <- uniqueId
j <- uniqueId
return (i + j)
의 라인, 내 마음에 와서 유일한 물건에 따라 코드로 결국 s
하고 있습니다 전역 변수 (매우 바람직하지 않은) 또는 하스켈의 모나드 인터페이스를 에뮬레이트하려는 시도가 있습니다. 두려움은 많은 작업이 될 것이고 코드 표기가 부족하여 느린 코드 tahts로 끝납니다. 생각하지 못한 대안이 있습니까?
에서 얻을 수 있습니다 전 세계적으로 국가의 변화를 원한다. 나는 당신이 달성하고자하는 것이라고 생각합니다 : '1. 상태를 갖는 함수 f (make_things). 2. f를 호출 할 때마다 상태는 으로 재설정됩니다. 3. 그러나 f의 내부 호출 중에는 상태가 자동으로 변경 될 수 있습니다. '내 추측이 맞습니까? –