Ocaml 错误:引用未定义的全局'Num';

Ocaml 错误:引用未定义的全局'Num';,ocaml,bignum,Ocaml,Bignum,我试图在OCaml中使用Num模块(bignums和大分数)。有些事情似乎有效,而另一些事情似乎无效,我无法生成一个完整的示例。例如: # Num.Int(234);; - : Num.num = Num.Int 234 # Num.mult_num;; Characters -1--1: Num.mult_num;; Error: Reference to undefined global `Num' 我可以问一个简单的两个大整数相乘的例子吗 Num的参考是。默认情况下未链接的库提供了N

我试图在OCaml中使用
Num
模块(bignums和大分数)。有些事情似乎有效,而另一些事情似乎无效,我无法生成一个完整的示例。例如:

# Num.Int(234);;
- : Num.num = Num.Int 234
# Num.mult_num;;
Characters -1--1:
  Num.mult_num;;
Error: Reference to undefined global `Num'
我可以问一个简单的两个大整数相乘的例子吗


Num
的参考是。

默认情况下未链接的库提供了
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>
# 

包含该模块的库的名称在本节开头提供。对于其中许多模块,库的名称与它所包含的唯一模块的名称相同,但这是一种约定,而不是义务。对于包含多个模块的库(如
Num
),您需要查找库的名称。

Num
是一个独立的库(不是标准库的一部分),必须在顶级中使用它

$ ocaml nums.cma

# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
$ocaml nums.cma
#Num.mult_Num;;
-:Num.Num->Num.Num->Num.Num=

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

# #load "nums.cma";;
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
(或者最好把它放在
~/.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
(如果
ocamlfind
-因此
topfind
-不可用,请使用安装。)

下面是一个乘法示例:

# Num.(num_of_int 30 */ num_of_int 1234);;
- : Num.num = Num.Int 37020
结构
Num.(e)
let open Num in e
的简写,可以在
e
中使用
Num
函数而不使用前缀。以下是阶乘的定义:

# 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>

这更容易阅读

你在一次回答中教会了我很多ocaml!谢谢
# Num.(num_of_int 30 */ num_of_int 1234);;
- : Num.num = Num.Int 37020
# 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>
# fac Num.(Int 100);;
- : Num.num = Num.Big_int <abstr>
# fac Num.(Int 100);;
- : Num.num =
<num 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000>