Programare funct ,ional în CAML [631917]
Programare funct ,ional în CAML
Gr mescu Gheorghe Florin
Master An ul I
Inginerie Soft w are
Cuprins
1 Abstract 3
2 Programare funct , ional 4
In tro ducere 4
Istoric 4
Caracteristici 5
A v an ta jele program rii funct , ionale 5
3 CAML 7
ML(Meta-Language) 7
Expresii de baz în CAML 8
Ev aluarea expresiilor 8
V ariabile si funct , ii 9
Liste 11
P olimorsm 11
4 Programare funct , ional cu tastare static în CAML 13
Tipuri 14
Tipuri de construct , ii în Caml 15
Programare 3D 16
5 Bibliograe 19
2
1 Abstract
In the follo wing article I presen ted the essen tial information ab out func-
tional programming, esp ecially in the programming language CAML, whic h
is: a m ulti-paradigm, a general-purp ose programming language that is a di-
alect of the ML family .
The rst part of the article includes: some information and denitions, along
with a brief history and main concepts presen t in functional programming.
The second part con tains information ab out Meta-language and CAML prop-
erties, expression ev aluation, primitiv e t yp es, v ariables, functions presen t in
this programming language.
The last part refers to the functional programming b y static t yping b y sp ec-
ifying: t yp es, constructing t yp es, and 3D programming.
3
2 Programare funct ,ional
Un lim ba j declarativ ideal care sp ecic doar relat , iile din tre datele s , i rezul-
tatele problemei, f r a indica mo dul de transformare al datelor p en tru a
satisface aceste relat , ii. [1]
Caracteristicile lim ba jelor funct , ionale:
1. Au un sup ort matematic solid;
2. Au un grad ridicat de abstractizare;
3. Realizeaz sin teza automata a tipurilor
4. P ot implemen tate paralel
Probleme:
Este greu de estimat necesarul de resurse (timp, spat , iu);
Este greu de incorp orat (input/output). [2]
In tro ducere
Lim ba jele de programare funct , ional sun t sp ecial concepute p en tru
a face fat , calculului sim b olic s , i aplicat , iilor de pro cesare al listelor. Pro-
gramarea funct , ional se bazeaz p e funct , ii matematice. Unele din tre cele
mai p opulare lim ba je de programare funct , ional sun t: Lisp, Python, Erlang,
Hask ell, Clo jure, etc. [3]
Lim ba jele de programare funct , ional sun t clasicate în dou grupuri:
Lim ba je funct , ionale pure (Pure F unctional Languages) – A ceste tipuri de
lim ba je funct , ionale accept n umai paradigmele funct , ionale. De exemplu –
Hask ell.
Lim ba je funct , ionale impure (Impure F unctional Languages) – A ceste tipuri
de lim ba je sprijin paradigmele funct , ionale s , i programarea imp erativ a stilu-
lui, de exemplu – LISP .
4
Istoric
Calculul Lam b da ofer un cadru teoretic p en tru descrierea funct , iilor s , i
ev aluarea lor. Se aseaman mai m ult cu o abstractizare matematic decât cu
un lim ba j de programare. O form ul teoretic ec hiv alen t este logica com bi-
natorie, aceasta este p erceput ca ind mai abstract decât calculul lam b da.
Logica com binatoric s , i calculul lam b da au fost init , ial dezv oltate p en tru a
realiza o ab ordare mai clar a funct , iilor matematice. [4]
Logica com binatoric este o baz teoretic ec hiv alen t , dezv oltat de
Moses Sc hönnk el s , i Hask ell Curry , aceast logica a fost dezv oltat înain-
tea mo delului Lamda s , i este p erceput ca ind mai abstract .
Caracteristici
Caracteristicile Lim ba jele de programare funct , ional
1) Lim ba jele de programare funct , ional sun t concepute p e conceptul de
funct , ii matematice care folosesc expresii condit , ionate s , i recursiv e p en tru a
efectua calcule.
2) Programarea funct , ional sup ort funct , ii de ordin sup erior.
3) Lim ba jele de programare funct , ional n u accept uxul de con troale,
cum ar : instruct , iunile de tip "bucl " s , i instruct , iunile condit , ionale( If-Else
s , i Switc h). A cestea folosesc direct funct , iile s , i ap elurile funct , ionale.
4) Ca s , i programarea orien tata obiect, lim ba jele de programare funct , ionale
accept concepte p opulare, cum ar abstractizarea, încapsularea, mos , tenirea
s , i p olimorsm ul.
5
A v an ta jele program rii funct ,ionale
Programarea funct , ional ofer urm toarele a v an ta je:
Programarea paralel ecien t – Lim ba jele de programare funct , ional n u
au starea m utabil , deci n u exist probleme de sc him bare de stare. F unct , iile
p ot programate s funct , ioneze paralel ca si instruct , iunile. A cest lucru spri-
jinind reutilizarea s , i testabilitatea us , oar . [5]
Ecient , – Programele funct , ionale sun t alcatuite din: unit t , i indep en-
den te care p ot rula sim ultan. Ca urmare, astfel de programe sun t mai e-
cien te.
Sup ortabilitatea funct , iilor niv elate – Sun t sup ortate functiile Nested.
Sup orta ev aluare "lazy" – Sun t sup ortate ev aluari Lazy (o strategie de
ev aluare care în târzie ev aluarea unei expresii pân când v aloarea acesteia
este necesar ) cum ar : Lazy Lists s , i Lazy Maps. [6]
6
3 CAML
Caml (Categorical abstract mac hine language) este un lim ba j de pro-
gramare m ulti-paradigm s , i un dialect al familiei de lim bi de programare
ML.
Ca m ult , i descendent , i ai ML-ului, Caml este tip rit static, strict ev aluat s , i
utilizeaz gestionarea automat a memoriei.
Caml este un lim ba j de programare cu scop general, abil s , i sigur. Este
foarte expresiv, dar us , or de în v t , at s , i de utilizat. Caml sprijin programarea
funct , ional , imp erativ s , i orien tat p e obiect. A cesta a fost dezv oltat s , i dis-
tribuit de INRIA, o cercetare francez în informatic s , i matematic aplicat ,
din 1985. [7]
Sistem ul OCaml este implemen tarea principal a lim ba jului Caml. A cesta
dispune de un sistem puternic de mo dule s , i de un strat complet orien tat spre
obiect. Vine cu un compilator de co d nativ care sup ort n umeroase arhitec-
turi, p en tru p erformant , ridicat ; un compilator b yteco de, p en tru o p orta-
bilitate sp orit ; s , i o bucl in teractiv , p en tru exp erimen tare s , i dezv oltare
rapid .
Sistem ul Caml Ligh t este o implemen tare us , oar s , i p ortabil a n ucleului
lim ba jului Caml. Datorit st rii sale stabile, aceasta este folosit în general
în educat , ie. [7]
ML(Meta-Language)
M L este un lim ba j funct , ional, ceea ce înseamn c folosind acest lim ba j
funct , iile sun t tratate ca v alori de prima clas F unct , iile p ot im bricate, p ot
transmise ca argumen te la altor funct , ii, p ot sto cate în structurile de date.
Exemple de asignare care mo dic p ermanen t v aloarea an umitor expresii
sun t p ermise, dar se utilizeaz m ult mai put , in frecv en t decât în lim ba jele C
sau Ja v a.
Sistemele tip ML sun t p olimorce, ceea ce înseamn c este p osibil
scrierea de programe care funct , ioneaz p en tru v alori de orice tip, de ex-
emplu: structuri de date: listele, stiv e s , i arb ori ce p ot cont , ine elemen te de
7
orice tip. [8]
Expresii de baz în CAML
OCaml este un lim ba j puternic tipizat: ecare expresie trebuie s aib
un tip, acestea n u p ot folosite ca expresii în tr-un alt tip.
Tipurile de baz sun t: unit, in t, c har, oat, b o ol s , i string.
Unit reprezin t tipul unitate s , i cel mai simplu tip din OCaml, cont , ine
un singur elemen t: ()
In t este tipul de n umere în tregi:. … -1, 0, 1,… Precizia este nit. P e o
arhitectur bazat p e 32 de bit , i, precizia este de 31 bit , i (un bit este rezerv at
p en tru utilizarea de c tre run time). P e o arhitectur p e 64 de bit , i, precizia
este de 63 bit , i, prim ul ind folosit p en tru acelas , i scop ca s , i în cazul arhitec-
turii p e 32 de bit , i. [9]
Float este timpul n umerelor în tregi, n umere cu oricâte zecimale sau n u-
mere cu un exp onen t în baza 10, notat cu E. Example: 0,5; 3,51; 2e18.
Char tipul de caractere ce implemen teaza caractere din setul de caractere
ASCI I. A cestea se declar în tre ghilimele, exemplu: 'A', 'Z', '120', ' t', ' r', '
n'
Bolean . Exist doar dou v alori b o oleene: adev rat s , i fals. Fiecare
relat , ie returneaz o v aloare b o olean . Negarea logic este efectuat de funct , ia
nefunct , ional . [10]
String . Spre deosebire de s , irurile de caractere din C, aici acestea n u sun t
v ectori de caractere s , i n u folosesc ' 000' ca s , i caracter terminal. Exemplu:
"Pro ject","Caml".
8
Ev aluarea expresiilor
Un program Caml este o secv ent , de expresii, delimitate prin ";;" s , i
ev aluate în ordine, conform aparit , iei lor în secv ent , , ecare expresie ind
ev aluat o singur dat . [8]
Pro cesul de ev aluare a expresiilor Caml p oate privit ca un pro ces
de transform ri succesiv e (rescrieri) ale expresiilor.
Etap ele acestor transform ri sun t:
1. P arsarea;
2. Sin teza tipurilor;
3. Compilarea;
4. Înc rcarea;
5. Execut , ia;
6. As , area rezultatelor execut , iei;
Observ at , ii:
V ersiunea original de Caml ev aluaz funct , iile înain tea argumen telor (left-
to-righ t ev aluation), p e când Caml Ligh t ev alueaz argumen tele înain tea
funct , iilor (righ t-to-left ev aluation).
Caml foloses , te ap elul prin v aloare (call-b y-v alue).
V ariabile si funct ,ii
V ariabile
În ML, v ariabilele sun t n ume p en tru v alori. În tr-un cadru pur funct , ional,
n u este p osibil s se spun diferent , a din tre o v ariabil s , i v aloarea p e care
o reprezin t . Leg turile din tre v aloare si v ariabile sun t in tro duse folosind
cuv ân tul c heie Let . Sin taxa declarat , iei este: let name = expr. [11]
De exemplu, urm torul co d denes , te dou v ariabile a s , i b s , i le adun
împreun p en tru a obt , ine o v aloare p en tru c.
9
# let a = 1;;
v al a : in t = 1
# let b = 2;;
v al b : in t = 2
# let c = a + b;;
v al c : in t = 3
Denit , iile ce folosesc let p ot , de asemenea, im bricate folosind "in", ex-
emplu: let name = expr1 in expr2
Expresia expr2 este n umit corpul lui let, expr1 este n umele v ariabilei
denite ca v aloarea în in teriorul corpului. Dac exist o singur denit , ie
n ume, n umele v ariabilei este denit n umai în corpul expr2 s , i n u în expr1
(sau oriunde altundev a).
# let x = 1 in
# let y = 2 in
# x + y;;
– : in t = 3
F unt , iile
F unct , iile sun t denite folosind cuv ân tul c heie fun , acesta este urmat de:
o secv ent , de v ariabile ce denesc argumen tele, separatorul -> s , i ap oi corpul
funct , iei. [12]
În mo d implicit, funct , iile n u sun t den umite, acestea se den umesc folosind
cuv an tul c heie let .
# let incr = fun i -> i + 1;;
# v al incr : in t -> in t = <fun>
P aran tezele sun t necesare p en tru argumen te care n u sun t expresii simple.
# incr 2;;
– : in t = 3
# incr 2 * 3;;
– : in t = 9
# incr (2 * 3);;
– : in t = 7
10
F unct , iile p ot denite cu mai m ulti argument , i. De exemplu, o funct , ia
care calculeaz suma a dou n umere în tregi p oate denit dup cum
urmeaz :
# let sum = fun i j -> i + j;;
# v al sum : in t -> in t -> in t = <fun>
# sum 5 11;;
– : in t = 16
Liste
Listele sun t de asemenea utilizate în programele OCaml. O list cont , ine
o secv ent , de v alori de acelas , i tip. Exist doi constructori: expresia [] ce de-
neste o list goal s , i expresia e1 :: e2 ce deneste expresia expresiei e1 p e
lista e2. [12]
# let list = "Pro ject" :: "Caml" :: [];;
– v al list : string list = ["Pro ject"; "Caml"]
Sin taxa [e1; . . . ; en] este o sin tax alternativ p en tru lista care cont , ine
v alorile construite din elemen tele e1,. . . , en. O list in t este o list
care cont , ine doar n umere în tregi, o list de s , ir este o list care cont , ine doar
s , iruri, iar o list "a" este o list care cont , ine elemen te de tip "a" (dar toate
elemen tele trebuie s aib acelas , i tip).
P olimorsm
Meta-Language furnizeaz p olimorsm parametric, tipurile p ot parametrizate
dup v ariabilele de tip. De exemplu, funct , ia de iden titate din ML p oate
exprimat prin tr-o singur funct , ie.
# let iden tit y x = x;;
# v al iden tit y : 'a -> 'a = <fun>
# iden tit y 1;;
11
– : in t = 1
# iden tit y "Message";;
– : string = "Message"
V ariabilele de tip sun t iden ticatori cu litere mici, precedate de o singur
ghilimea ('). Iden titatea : 'a ->' a spune c funct , ia are un argumen t de
tip arbitrar "a" s , i returneaz o v aloare de acelas , i tip "a". Dac se aplic
funct , ia de iden titate la un in t, atunci returneaz un in t; dac este aplicat
un ui s , ir, atunci ea returneaz un ³ir. F unct , ia de iden titate p oate aplicat
s , i în argumen tele funct , iei [13]
12
4 Programare funct ,ional cu tastare static în
CAML
În op ozit , ie cu Sc hema s , i LISP , p e baza tratamen tului laten t al tipurilor,
exist programe, lim ba je de programare funct , ionale unde sistem ul este de tip
elab orat s , i solid. În aceste lim ba je, logica din spate este sust , in ut de tipul
Lam b da.
Asemenea lim ba je sun t tip rite static (adic v ericarea se face in timpul
compil rii). Mai m ult decât atât, pro cesarea datelor corecte este impus prin
regulile un ui sistem de tip matematic bine fondat. [14]
Prin tr-un sistem de tip, înt , elegem un set de reguli s , i mecanisme folosite
în tr-un lim ba j de programare, menite s organizeze, s construiasc s , i s op-
ereze tipurile acceptate în lim ba jul resp ectiv .
A ceste mecanisme s , i regulile se refer la urm toarele asp ecte ma jore:
Denirea de noi tipuri.
Aso cierea tipurilor cu diferite construct , ii de lim bi.
Decizia privind ec hiv alent , a de tip, reprezin t capacitatea de a determina
când sun t diferite aceleas , i tipuri.
V ericarea compatibilit t , ii tipului, adic a aa dac o v aloare al un ui an-
umit tip p oate folosit corect în tr-un an umit con text de pro cesare.
Inferierea tipurilor de construct , ii de lim ba j atunci când n u sun t explicit
declarate.
Ca s , i în Sc hem , elemen tul de baz al lim ba jului este funct , ia, considerat
ca o v aloare de prim clas . O funct , ie "1-ary" este reprezen tat ca:
fun formal -> expression
Caml este un domeniu complet static ce pro duce o înc hidere funct , ional .
Cu toate acestea, Caml este un lim ba jul ce prezin t v ariabilele de niv el sup e-
rior ce au o sfer static : partea din program, dup punctul lor de denire.
A cest lucru a jut la resp ectarea transparent , ei de referint , , în cazul efectelor
secundare, daca n u sun t abuzate.
13
Expresiile sp eciale de niv el sup erior:
let v ariable = expression;;
let rec v ariable = expression;;
Expresiile leag v ariabila de v aloarea expresiei. Domeniul sau regiunea
v ariabilei este partea din program care urmeaz termen ul de exprimare, re-
sp ectiv, partea din program care urmeaz expresia rec, incluzând-o s , i p e
aceasta.
De exemplu, expresia de mai jos leag v ariabila sum la o înc hidere funct , ional
(o funct , ie curried). [15]
let sum = fun 1 -> fun 2 -> 1 + 2;;
sum : in t -> in t = <fun>
Observ at , e, o expresie pro duce dou v alori: v aloarea expresiei s , i tipul aces-
teia.
De exemplu, v aloarea plus este o funct , ie desemnat de <fun>, cu domeniul:
in t s , i in terv alul in t -> in t, adic semn tura corespunz toare funct , iilor a c ror
domeniu s , i in terv al sun t de tipul în treg. Tipul unei expresii n u trebuie sp ec-
icat în mo d explicit; se deduce p e baza tipurilor comp onen telor sale.
Let si Let rec sun t expresii de denire a domeniului:
let v ar1 = expr1
v ar2 = expr2
…
v arn = exprn
Domeniul de aplicare al v ariat , iei i = 1,n este expresia expr . Expresiile
expri sun t ev aluate în tr-o ordine nesp ecicat . V ariabila v ari este legat de
rezultatul ev alu rii expri s , i ap oi expr este ev aluat . Rezultatul expr este
rezultatul expresiei let de mai sus. Expresia este una similar cu expresia
let cu diferent , a c domeniul v ariat , iei este în treaga expresie let rec . Cu alte
cuvin te, expresiile expri p ot referi v ariabilele v ari . [16]
14
Tipuri
Caml este tip rit static. Tipurile sun t aso ciate atât v ariabilelor cât s , i v alorilor
s , i sun t v ericat p en tru consistent , în timpul compil rii. Mai m ult, tastarea
expresiilor s , i a v ariabilelor p ot efectuate automat, f r nicio declarat , ie ex-
plicit de tip. [17]
Ca abstract , ie algebric , un tip este triple T = <V, Op, Ax> unde V este
setul de v alori de tip, Op este setul de op eratori de tip (inclusiv semn turile
op eratorilor), iar Ax este un set de axiome care descriu comp ortamen tul
op eratorilor. A cest denit , ie fa v orizeaz p ersp ectiv a constructiv a v alorilor
tipului.
Tipuri de construct ,ii în Caml
Fiecare lim ba j de programare vine cu un set de tipuri predenite s , i
tipuri care p ot construite de c tre utilizator. [18] Putem nota acest univ ers
de tipuri: MT s , i consider m c este un tip de meta-tip ale c ror v alori sun t
tipuri. În plus, o lim b ofer constructorilor de tip, o funct , ie de forma c:
MT n! MT, n 0. În cazul lui Caml, constructorii de tip 0 (tipuri predef-
inite) sun t: in t (tipul în treg), b o ol (tipul b o olean), oat (tipul cu virgul
mobil ) c har (tipul de caractere), s , ir (tipul de s , ir), unitate (tipul gol) s , i exn
(tip except , ional). [19]
Op eratorii sun t la fel ca în ma joritatea lim ba jelor de programare. Except , ia
este tipul: b o ol, unde constan tele sun t: fals s , i adev rat, iar op eratorii sun t:
& (the b o olean and), or, and not. Ca s , i în cazul un ui tip con v ent , ional, putem
deni v ariabile p este MT. O astfel de v ariabil de tip p oate legat la o v al-
oare din MT, adic la un tip. În Caml, v ariabilele de tip sun t reprezen tate
ca: iden ticatori.
F olosind constructori de tip din MT (tipuri predenite) putem construi
expresii de tip care v or reprezen ta noi tipuri din MT. [19] De exemplu, Caml
ofer urmatorii constructori de tip:
MT n! MT Expresia de tip 1 * 2 * … * n, i2 MT, construies , te
tipul corespunz tor al pro dusului cartezian 1 2 … n. Se prezin t
o constan t de tip 1 * 2 * … * n ca triplet: (a1, a2, …, an), ai: i.
15
P en tru tipurile particulare: 1 * 2 , exist doi op eratori predenit , i: fst
(a1, a2) = a1 s , i snd (a1, a2) = a2.
list : MT! MT Tipul expresiei list, 2 MT, construies , te tipul core-
spunz tor listei cu elemen te de tip . O constan t a listei de tip este
reprezen tat ca [a1; a2; …; an]; ai: .
O categorie in teresan t de constructori de tip este cea care construies , te
tipuri de sume. A ces , ti constructori n u sun t predenit , i s , i trebuie denit , i ex-
plicit folosind expresia:
t yp e id = ncon1 | ncon2 | . . . | nconm |
con1 of 1 | con2 of 2 | . . . | conn of n
Expresia construies , te un constructor de sum n umit id al c rui v alori
sim b olice sun t e: nconj , e coni (ai), ai: i. Aici nconj s , i coni sun t iden ti-
catori care joac rolul un ui constructor de v alorilor de tip id: adic nconj:
! id s , i coni: i! id .
Constructorii de tip sum p ot parametrizat , i. [20] Suma constructorului
de sum 1 a liste: nested_list de mai jos descrie o list care p oate cont , ine
v alori de tip generic s , i, în mo d recursiv, liste de acelas , i tip:
t yp e 'a nested_list = atom of 'a
| branc h of 'a nested_list ;;
Deoarece este un constructor de tip, nested_list p oate aplicat p e un
tip p en tru a obt , ine un tip sp ecic de lista. De exemplu, in t nested_list
este tipul ce con tine o lista de n umere în tregi.
16
Programare 3D
Spre deosebire de Sc hem unde programarea este 2D, o dimensiune
corespunde logicii program, iar cealalt dimensiune este timpul de ev aluare
al expresiilor program ului. Caml, prezin t p osibilitatea program rii 3D, prin
adaugarea unei dimensiuni noi, reprezen tat prin: tipurie de expresii. Când
construim programe, trebuie s ne asiguram c tipurile de expresii p e care le
scriem corespund cu ceea ce ne gândim. Luarea în considerare a semnicat , iei
expresiilor este crucial în programare in Caml [21] .
De exemplu, luarea în considerare asupra redenirii mecanism ului uxu-
lui as , a cum este implemen tat, în prim ul rând trebuie s denim uxul de tip
al elemen telor de tip generic "a (v ariabil de tip).
t yp e 'a stream = nil | term of 'a * (unit -> 'a stream);;
V aloarea sim b olic a lui nil reprezin ta uxul gol. T ermen ul de v aloare
sim b olic (t, funct , ie) reprezin t un termen al un ui ux ce n u este gol: t este
v aloarea termen ului, funct , ia este de înc hidere, capabil s genereze urm –
torul termen al uxului. [23]
Exemple de op eratori de ux:
(cons t f ) – construies , te termen ul de ux (t, f ).
hds(term(t,f )) – revine la prima v aloare a uxului
tls(term(t,f )) – returneaz termen ul de ux generat de aplicat , ia f ().
t yp e 'a stream = nil | term of 'a * (unit -> 'a stream);;
exception StreamError of string;;
let cons x f = term(x,f )
and hds = fun nil -> raise(StreamError "hds on nil")
| (term(x, _ )) -> x
and tls = fun nil -> raise(StreamError "tls on nil")
| (term( _ ,f )) -> f();;
cons: 'a -> (unit -> 'a stream) -> 'a stream = <fun>
hds: 'a stream -> 'a = <fun>
tls: 'a stream -> 'a stream = <fun>
17
Exemplu: Construirea uxului temenilor lui :
= 4 – 4/3 + 4/5 – 4/7 + 4/9 – 4/11 +. . .
18
5 Bibliograe
[1] P aul Hudak Y ale Univ ersit y , Septem b er 1989. "Conception, ev olution,
and application of functional programming languages"
[2][3] Minsky , Y aron; W eeks, Stephen (July 2008). "Caml T rading ex-
p eriences with functional programming on W all Street"
[4][5] Lero y , Xa vier "Some uses of Caml in Industry", CUFP 2007
[6] h ttp://www.n uprl.org/do cumen ts/Hic k ey/02caltec h-o caml.p df.
[7] The F unctional Approac h to Programming with Caml b y Guy Cousineau
and Mic hel Maun y . F renc h 1995
[8] Strein u -" Lisp – Lim ba jul de programare al in teligen tei articiale" , Ed.
St. si Enc., Bucuresti, 1986
[9][10] Cardelli, Luca (1984). "Compiling a functional" language
[11][12] "In tro duction to the Ob jectiv e Caml Programming Language" ,
Jason Hic k ey ,F ebruary 10, 2003".
[13]https://en.wikipedia.org/wiki/Functional_programming
[14]https://en.wikipedia.org/wiki/Caml
[15]http://labs.cs.upt.ro/labs/cflp/html/cflp10.php#let
[16][17]https://profs.info.uaic.ro/~ibanescu/pf/lab1.html
[18]http://andrei.clubcisco.ro/cursuri/2pp/07.Caml.pdf
[19]https://caml.inria.fr/pub/docs/oreilly-book/ocaml-ora-book.pdf
[20]http://atm.neuro.pub.ro/radu_d/html/09_10/IAM_TAPSM/Paradigme%20de%20Programare_v1.pdf
[21]https://msdn.microsoft.com/en-us/library/dd588092(v=office.11).aspx
19
[22] Y aron Minsky (1 No v em b er 2011). "OCaml for the Masses".
[23] Ritzer George. 1991. "Metatheorizing in So ciology", Published b y:
Springer.
20
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Programare funct ,ional în CAML [631917] (ID: 631917)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
