Error: Reference to undefined global `Num'
Error: Reference to undefined global `Num'
我正在尝试使用 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
的参考是 here。
Num
模块由默认情况下未 link 的库提供。您需要在 linker 或顶级命令行上传递库。您可以使用模块中的类型(例如 Num.num
)和构造函数(例如 Num.Int
),因为它们只需要静态(编译时)信息,但使用变量(包括函数,例如 Num.mult_num
) 需要动态信息(代码),必须 link 明确输入。
顶层使用:
$ ocaml nums.cma
OCaml version 4.01.0
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
#
要编译并link一个程序:
ocamlc -o myprogram.byte myfile.ml nums.cma
ocamlopt -o myprogram.native myfile.ml nums.cmxa
包含模块的库的名称在 chapter about the library in the Ocaml reference manual 的开头提供。对于其中的许多,库的名称与其包含的唯一模块的名称相同,但这是约定,而不是义务。对于像nums
这样包含多个模块的库,您需要查找库的名称。
Num
是一个独立的库(不是标准库的一部分),在顶层使用它之前必须是必需的。
$ ocaml nums.cma
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
如果顶层已经启动,可以动态加载库:
# #load "nums.cma";;
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
另一种可能性(适用于所有第三方库并将为您管理路径和依赖项)是使用 ocamlfind
。为此,问题
#use "topfind";;
(或者最好将其放入您的 ~/.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
— 不可用,请使用 opam 安装它。)
下面是一个乘法的例子:
# Num.(num_of_int 30 */ num_of_int 1234);;
- : Num.num = Num.Int 37020
构造 Num.(e)
是 let open Num in e
的 shorthand 并且可以在 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>
你可以试试
# fac Num.(Int 100);;
- : Num.num = Num.Big_int <abstr>
如果您使用 #require
,它会为 Num
值安装漂亮的打印机,因此之前的交互看起来像:
# fac Num.(Int 100);;
- : Num.num =
<num 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000>
哪个更容易阅读!
我正在尝试使用 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
的参考是 here。
Num
模块由默认情况下未 link 的库提供。您需要在 linker 或顶级命令行上传递库。您可以使用模块中的类型(例如 Num.num
)和构造函数(例如 Num.Int
),因为它们只需要静态(编译时)信息,但使用变量(包括函数,例如 Num.mult_num
) 需要动态信息(代码),必须 link 明确输入。
顶层使用:
$ ocaml nums.cma
OCaml version 4.01.0
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
#
要编译并link一个程序:
ocamlc -o myprogram.byte myfile.ml nums.cma
ocamlopt -o myprogram.native myfile.ml nums.cmxa
包含模块的库的名称在 chapter about the library in the Ocaml reference manual 的开头提供。对于其中的许多,库的名称与其包含的唯一模块的名称相同,但这是约定,而不是义务。对于像nums
这样包含多个模块的库,您需要查找库的名称。
Num
是一个独立的库(不是标准库的一部分),在顶层使用它之前必须是必需的。
$ ocaml nums.cma
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
如果顶层已经启动,可以动态加载库:
# #load "nums.cma";;
# Num.mult_num;;
- : Num.num -> Num.num -> Num.num = <fun>
另一种可能性(适用于所有第三方库并将为您管理路径和依赖项)是使用 ocamlfind
。为此,问题
#use "topfind";;
(或者最好将其放入您的 ~/.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
— 不可用,请使用 opam 安装它。)
下面是一个乘法的例子:
# Num.(num_of_int 30 */ num_of_int 1234);;
- : Num.num = Num.Int 37020
构造 Num.(e)
是 let open Num in e
的 shorthand 并且可以在 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>
你可以试试
# fac Num.(Int 100);;
- : Num.num = Num.Big_int <abstr>
如果您使用 #require
,它会为 Num
值安装漂亮的打印机,因此之前的交互看起来像:
# fac Num.(Int 100);;
- : Num.num =
<num 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000>
哪个更容易阅读!