gpt4 book ai didi

operators - 如何 optional 地提供 OCaml (let*) 运算符以与新旧编译器一起使用?

转载 作者:行者123 更新时间:2023-12-03 23:40:08 25 4
gpt4 key购买 nike

我有一个模块 MyMonad提供绑定(bind)函数为(let*)运算符,也可作为 >>=旧式代码的运算符。
这个想法是旧代码可以将其用作:

let foobar () =
let open MyMonad in
foo "test" >>= fun s ->
bar s 1 >>= fun (a, b) ->
return a + b
并且在 OCaml >= 4.08 上编译的新代码可以将其用作:
let foobar () =
let open MyMonad in
let* s = foo "test" in
let* a, b = bar s 1 in
return a + b
模块内部 MyMonad.ml ,这些运算符以直接的方式实现:
let (>>=) a f =
...

let (let*) = (>>=)
但是,在 OCaml <= 4.07 上,最后一行是语法错误。 val (let*) : ... 也是如此。 MyMonad.mli 中的行接口(interface)文件。
这个问题尤其是当这个模块也打算用于 BuckleScript(现在的 ReScript)时,它基于 OCaml 4.06,并且不清楚他们何时会升级到更高的 OCaml 版本。
如何将最后几行标记为仅在 OCaml >= 4.08 上编译?
注意:我知道我可以创建两个模块,一个添加 (let*)在另一个之上并被旧编译器排除在外。但我想知道是否有更优雅的解决方案。

最佳答案

要自己回答这个问题,确实需要坚持>>=。 , 新语法可以通过 使用垫片 使用旧的 OCaml 编译器,甚至是 BuckleScript(现在是 ReScript)。
后者可以如下实现:

  • 在 4.06 OCaml 编译器的当前目录中创建一个新的 OPAM 开关。这是当前 BuckleScript 版本所基于的版本,需要说服 shims 实际执行某些操作(对于最新的编译器版本,它们将编译为无操作):
    opam switch create -wy --no-install . 4.06.0
  • 安装 ocaml-syntax-shims OPAM 包:
    opam install -wy ocaml-syntax-shims
  • 为您添加以下预处理行 bsconfig.json配置文件:
    {
    "pp-flags": "./_opam/bin/ocaml-syntax-shims -dump-ast",
    ...
    }
  • 关于operators - 如何 optional 地提供 OCaml (let*) 运算符以与新旧编译器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66256575/

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