2015-06-14 13 views
8

Sto cercando di utilizzare il modulo Num in OCaml (bignum e grandi frazioni). Alcune cose sembrano funzionare, mentre altre sembrano non farlo, e non sono in grado di generare un singolo esempio completo. Per esempio:Errore: Riferimento undefined globale `Num'

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

Posso chiedere un semplice esempio di moltiplicazione di due bignum?

La domanda Num è here.

risposta

9

Se il livello superiore è già avviata, è possibile caricare in modo dinamico la libreria:

# #load "nums.cma";; 
# Num.mult_num;; 
- : Num.num -> Num.num -> Num.num = <fun> 

Un'altra possibilità (che funziona per tutte le librerie di terze parti e gestirà i percorsi e le dipendenze per voi) è di utilizzare ocamlfind. Per questo, problema

#use "topfind";; 

(o meglio metterlo nel file ~/.ocamlinit). Per caricare una libreria, basta fare

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

Ecco un esempio di moltiplicazione (Se ocamlfind - - da qui topfind non è disponibile, installarlo utilizzando opam.):

# Num.(num_of_int 30 */ num_of_int 1234);; 
- : Num.num = Num.Int 37020 

Il costruzione Num.(e) è un'abbreviazione per let open Num in e e rende possibile utilizzare le funzioni senza Num prefisso e.Ecco una definizione del fattoriale:

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

si può provare con

# fac Num.(Int 100);; 
- : Num.num = Num.Big_int <abstr> 

Se è stato utilizzato #require, installa una bella stampante per Num valori così l'interazione precedente assomiglia:

# fac Num.(Int 100);; 
- : Num.num = 
<num 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000> 

che è molto più facile da leggere!

+0

Mi hai insegnato tonnellate di ocaml in una sola risposta! Grazie! –

5

Il modulo Num è fornita da una libreria che non è collegata per impostazione predefinita. È necessario passare la libreria sul linker o sulla riga di comando di livello superiore. È possibile utilizzare i tipi (ad esempio Num.num) e costruttori (per esempio Num.Int) dal modulo, in quanto richiedono solo statico (compile-time) le informazioni, ma utilizzando le variabili (comprese le funzioni, ad esempio Num.mult_num) richiedere informazioni dinamiche (codice), che deve essere collegato in modo esplicito.

Per uso toplevel:

$ ocaml nums.cma 
     OCaml version 4.01.0 

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

Per compilare e collegare un programma:

ocamlc -o myprogram.byte myfile.ml nums.cma 
ocamlopt -o myprogram.native myfile.ml nums.cmxa 

Il nome della libreria contenente il modulo è previsto all'inizio del chapter about the library in the Ocaml reference manual. Per molti di questi, il nome della libreria è lo stesso del nome del solo modulo che contiene, ma questa è una convenzione, non un obbligo. Per le librerie come nums che contengono più moduli, è necessario cercare il nome della libreria.

0

Num è una libreria indipendente (non inclusa nella libreria standard), che deve essere richiesta prima di essere utilizzata nel primo livello.

$ ocaml nums.cma 

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