如何解决如何可选地提供 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)一起使用。
后者可以实现如下:
-
在当前目录中为 4.06 OCaml 编译器创建一个新的 OPAM 开关。这是当前 BuckleScript 版本所基于的版本,需要说服垫片实际执行某些操作(对于较新的编译器版本,它们会编译为无操作):
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",... }
该语言或标准库的许多新增功能后跟通常称为 *-shims
的向后移植库。
对于您的问题,有
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。