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

标签 operators ocaml optional backwards-compatibility let

我有一个模块 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/

    相关文章:

    从 C 检查 OCaml 类型签名

    dictionary - OCaml 自引用图

    json - 2 oneOf 在 json 模式 : 1 required 1 optional

    foreign-keys - 使用 Entity Framework 7 的流体 API 创建 optional 外键

    javascript - 加法运算符在 JavaScript 中不起作用

    c - 什么是 C 中的 '#' 运算符?

    r - 例如 %+% 做什么?在 R

    ocaml - 如何将给定文件的全部内容读入字符串?

    java - 检查Optionals是否相等的便捷方法

    python - Python 中的新运算符