我是OCaml的初学者.我想知道如何在单独的文件中定义相互递归的数据类型.
我知道以下程序是合法的.
type t1 = A of int | B of t2
and t2 = C of float | C of t1
Run Code Online (Sandbox Code Playgroud)
现在,我想这个定义t1并t2在可读性其他文件(因为被需要来逐个很多util的功能).
我也知道,我可以定义t1并t2通过使作为上述.mli文件和隐藏实现细节(只写type t1和type t2在.mli文件).
但是,现在我不想隐藏它们.有谁知道怎么做?
我希望简单的解决方案(不使用复杂或魔术......).
我是menhir的初学者。我想知道如何用我自己的语言像元组模式一样解析 OCaml,这与 OCaml 非常相似。
例如,在表达式 中let a,b,c = ...,
a, b, c应该像 一样解析Tuple (Var "a", Var "b", Var "c")。
但是,在解析器的以下定义中,上面的示例被解析为Tuple (Tuple (Var "a", Var "b"), Var "c"). 我想知道如何修复以下定义来解析像 ocaml 这样的模式。
我已经检查了 OCaml 的 parser.mly,但我不确定如何实现这一点。我认为我的定义与 OCaml 的定义类似......他们使用了什么魔法?
%token LPAREN
%token RPAREN
%token EOF
%token COMMA
%left COMMA
%token <string> LIDENT
%token UNDERBAR
%nonassoc below_COMMA
%start <Token.token> toplevel
%%
toplevel:
| p = pattern EOF { p }
pattern:
| p = simple_pattern { p …Run Code Online (Sandbox Code Playgroud) 现在我尝试使用ocamlfind和编写一些编译器,特别是ppx_sexp_conv使用opam.
以某种方式依赖于ppx_sexp_convrequire,compiler-libs因此-I ~/.opam/VERSION/lib/compiler-libs在编译文件时添加了编译选项ocamlfind ocamlc -package ppx_sexp_conv.
问题是,compiler-libs包括像很常见的名称的文件parsing.cmi,main.cmi,lexing.cmi.
这会造成.cmi文件冲突并产生许多嘈杂的警告,如下所示:
$ ocamlfind ocamlc -package ppx_sexp_conv -c parser.mli
findlib: [WARNING] Interface main.cmi occurs in several directories: ., /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs
findlib: [WARNING] Interface lexer.cmi occurs in several directories: ., /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs
findlib: [WARNING] Interface topdirs.cmi occurs in several directories: /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs, /home/nomaddo/.opam/4.02.3/lib/ocaml
findlib: [WARNING] Interface parser.cmi occurs in several directories: ., /home/nomaddo/.opam/4.02.3/lib/ocaml/compiler-libs
Run Code Online (Sandbox Code Playgroud)
``` …
在下面的代码中, flake8 说F821 undefined name 'B'. 但是对于 mypy,需要输入提示f。flake8 如何忽略此类警告?
def f(b: B) -> None:
pass
class B():
pass
Run Code Online (Sandbox Code Playgroud)
这个例子可以很简单地解决:改变声明的顺序。但有时我无法在现实情况下更改订单。这种误导性的警告对我来说很吵。
我的环境:Python 3.6 + flake8 3.6.0 + mypy 0.641 + flake8-mypy 17.8.0