2015-06-14 21 views
8

我試圖在OCaml(bignums和大分數)中使用Num模塊。有些東西似乎在工作,而另一些似乎沒有,而且我無法生成一個完整的示例。例如:錯誤:引用未定義的全局`Num'

# 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

回答

9

如果頂層已經啓動,可以動態加載庫:

# #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的簡寫,並且使得在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> 

這是更容易閱讀!

+0

你在一個答覆中教給我很多ocaml!謝謝! –

5

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

要編譯和鏈接的程序:

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,您需要查找庫的名稱。

0

Num是一個獨立的庫(不是標準庫的一部分),在上層使用它之前必須要求它。

$ ocaml nums.cma 

# Num.mult_num;; 
- : Num.num -> Num.num -> Num.num = <fun>