错误:引用未定义的全局"Num"

May*_*erg 10 ocaml bignum

我正在尝试Num在OCaml中使用该模块(bignums和big fractions).有些东西似乎有效,而有些东西似乎没有,而且我无法生成一个完整的例子.例如:

# Num.Int(234);;
- : Num.num = Num.Int 234
# Num.mult_num;;
Characters -1--1:
  Num.mult_num;;
Error: Reference to undefined global `Num'
Run Code Online (Sandbox Code Playgroud)

我可以问一个两个bignums相乘的简单例子吗?

参考Num在这里.

Chr*_*riS 12

如果已启动顶层,则可以动态加载库:

# #load "nums.cma";;
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
Run Code Online (Sandbox Code Playgroud)

另一种可能性(适用于所有第三方库,并将为您管理路径和依赖项)是使用ocamlfind.为此,问题

#use "topfind";;
Run Code Online (Sandbox Code Playgroud)

(或者更好地把它放在你的~/.ocamlinit文件中).要加载库,就这样做

# #require "num";;
/usr/lib/ocaml/nums.cma: loaded
/home/user/.opam/system/lib/num-top: added to search path
/home/user/.opam/system/lib/num-top/num_top.cma: loaded
/home/user/.opam/system/lib/num: added to search path
Run Code Online (Sandbox Code Playgroud)

(如果ocamlfind- 因此topfind- 不可用,请使用opam安装它.)

以下是乘法的示例:

# Num.(num_of_int 30 */ num_of_int 1234);;
- : Num.num = Num.Int 37020
Run Code Online (Sandbox Code Playgroud)

构造Num.(e)是一种简写,let open Num in e并且可以使用Num没有前缀的函数e.这是阶乘的定义:

# let rec fac n =
    let open Num in
    if n =/ Int 0 then Int 1 else n */ fac (n -/  Int 1);;
val fac : Num.num -> Num.num = <fun>
Run Code Online (Sandbox Code Playgroud)

你可以尝试一下

# fac Num.(Int 100);;
- : Num.num = Num.Big_int <abstr>
Run Code Online (Sandbox Code Playgroud)

如果您使用过#require,它会为Num值安装一个漂亮的打印机,因此之前的交互看起来像:

# fac Num.(Int 100);;
- : Num.num =
<num 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000>
Run Code Online (Sandbox Code Playgroud)

这更容易阅读!


Gil*_*il' 6

Num模块由库提供,默认情况下不链接.您需要在链接器或顶层命令行上传递库.您可以使用模块中的类型(例如Num.num)和构造函数(例如Num.Int),因为它们只需要静态(编译时)信息,但使用变量(包括函数,例如Num.mult_num)需要动态信息(代码),必须明确链接.

用于顶级用途:

$ ocaml nums.cma
        OCaml version 4.01.0

# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
# 
Run Code Online (Sandbox Code Playgroud)

编译和链接程序:

ocamlc -o myprogram.byte myfile.ml nums.cma
ocamlopt -o myprogram.native myfile.ml nums.cmxa
Run Code Online (Sandbox Code Playgroud)

包含该模块的库的名称在Ocaml参考手册中有关库章节的开头提供.对于其中许多,库的名称与它包含的唯一模块的名称相同,但这是一种约定,而不是义务.对于nums包含多个模块的库,您需要查找库的名称.