我有一个模块 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)。
后者可以如下实现:
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/