gpt4 book ai didi

functional-programming - 在 OCaml 中是否有一种惯用的方法来执行隐式本地状态?

转载 作者:行者123 更新时间:2023-12-01 10:45:45 25 4
gpt4 key购买 nike

我想编写一些代码,使用一些本地状态构建一个东西。例如,考虑以下使用本地状态生成顺序整数的代码:

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 调用传递相同的状态参数。例如,在 Haskell 中,您可以使用 monads 和 do-notation 来结束代码

makeThings $ do
i <- uniqueId
j <- uniqueId
return (i + j)

在 Ocaml 中,我唯一想到的是使 s 成为全局变量(非常不受欢迎)或尝试模拟 Haskell 的单子(monad)接口(interface),我担心这会是很多工作并且由于缺少 do-notation 而导致缓慢的代码 tahts 也很丑陋。有没有我没有想到的替代方案?

最佳答案

Monad 也适用于 OCaml。由于 pa_monad_custom 语法扩展,您甚至可以使用 do-notation。虽然,在大多数情况下,只有一个中缀绑定(bind)运算符,即 >>= 就足以编写出精美的代码。

关于functional-programming - 在 OCaml 中是否有一种惯用的方法来执行隐式本地状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com