我想编写一些代码来构建一些使用本地状态的东西。例如,考虑使用本地状态产生连续整数下面的代码:在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 *)
()
我很好奇,如果有一种方法,使该makeThings内s
状态参数回调隐式的,所以我就不说了需要反复输入,因此保证所有uniqueId
调用都通过相同的状态参数。例如,在哈斯克尔你可以使用单子做,符号与沿
makeThings $ do
i <- uniqueId
j <- uniqueId
return (i + j)
线OCaml中,浮现在我的脑海里的唯一的东西代码落得正在s
一个全局变量(万劫)或者试图模仿Haskell的monadic接口,我担心这会导致很多工作,并且由于缺少标识符而导致代码编写慢也很难看。有没有我没有想到的替代方案?
获得你的问题是有点不明确,espcially你在你的脑海中提到'使SA全球variable',而是在利奥白您的评论你说你不希望全球变化。我想你想达到的是: '1。具有状态的函数f(make_things)。 2.每次调用f时,状态都会被重置 3.但是在一次调用f的过程中,状态可以自动改变。 '我的猜测是正确的吗? – 2014-10-07 16:00:02