小编nom*_*ddo的帖子

OCaml:是否可以在单独的文件中定义相互递归的数据结构

我是OCaml的初学者.我想知道如何在单独的文件中定义相互递归的数据类型.

我知道以下程序是合法的.

type t1 = A of int | B of t2
and  t2 = C of float | C of t1
Run Code Online (Sandbox Code Playgroud)

现在,我想这个定义t1t2在可读性其他文件(因为被需要来逐个很多util的功能).

我也知道,我可以定义t1t2通过使作为上述.mli文件和隐藏实现细节(只写type t1type t2.mli文件).

但是,现在我不想隐藏它们.有谁知道怎么做?

我希望简单的解决方案(不使用复杂或魔术......).

recursion ocaml module

6
推荐指数
1
解决办法
368
查看次数

OCaml + Menhir:如何像元组模式一样解析 OCaml?

我是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)

ocaml menhir

5
推荐指数
1
解决办法
1817
查看次数

OCaml:如何解决多个`cmi`s的findlib警告

现在我尝试使用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)

``` …

ocaml ocamlfind opam

4
推荐指数
1
解决办法
756
查看次数

Mypy + flake8:有什么办法可以抑制“F821 未定义名称”的警告

在下面的代码中, 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

python-3.x flake8 mypy

4
推荐指数
2
解决办法
3769
查看次数

标签 统计

ocaml ×3

flake8 ×1

menhir ×1

module ×1

mypy ×1

ocamlfind ×1

opam ×1

python-3.x ×1

recursion ×1