2015-06-14 18 views
8

मैं OCaml (bignums और बड़े अंशों) में 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> 

आप यदि आप #require इस्तेमाल किया

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

साथ यह कोशिश कर सकते हैं, यह Num मूल्यों के लिए एक सुंदर प्रिंटर स्थापित करता है तो पिछले बातचीत की तरह दिखता है:

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

जो पढ़ने के लिए बहुत आसान है!

+0

आपने मुझे एक ही जवाब में ओकंपल के टन सिखाए! धन्यवाद! –

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> 
संबंधित मुद्दे