微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何可选地提供 OCaml (let*) 运算符以与新旧编译器一起使用?

我有一个模块 MyMonad,它提供一个绑定函数作为 (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 val (let*) : ... 接口文件中的 MyMonad.mli 行也是如此。

这个问题尤其发生在当这个模块也用于 bucklescript(现在的 ReScript)时,它基于 OCaml 4.06 并且不清楚何时升级到更高的 OCaml 版本。

如何将最后几行标记为仅在 OCaml >= 4.08 上编译?

注意:我知道我可以创建两个模块,一个在另一个顶部添加 (let*) 并在旧编译器中被排除。但我想知道是否有更优雅的解决方案。

解决方法

要自己回答这个问题,确实需要坚持使用 >>=,新语法可以通过 shims 与旧的 OCaml 编译器甚至 BuckleScript(现在的 ReScript)一起使用。

后者可以实现如下:

  1. 在当前目录中为 4.06 OCaml 编译器创建一个新的 OPAM 开关。这是当前 BuckleScript 版本所基于的版本,需要说服垫片实际执行某些操作(对于较新的编译器版本,它们会编译为无操作):

    opam switch create -wy --no-install . 4.06.0
    
  2. 安装 ocaml-syntax-shims OPAM 包:

    opam install -wy ocaml-syntax-shims
    
  3. 将以下预处理行添加到您的 bsconfig.json 配置文件中:

    {
      "pp-flags": "./_opam/bin/ocaml-syntax-shims -dump-ast",...
    }
    
,

该语言或标准库的许多新增功能后跟通常称为 *-shims 的向后移植库。

对于您的问题,有

https://github.com/ocaml-ppx/ocaml-syntax-shims

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。