ML (programski jezik)
-{ML}- (eng. -{MetaLanguage}-) je programski jezik koji je razvio -{Robin Milner}- 1970-ih godina na Univerzitetu u Edinburgu. 
Njegova sintaksa je inspirisana -{ISWIM}--om (-{ISWIM}- je apstraktni programski jezik smišljen od strane -{P.J.Landin}-; akronim predstavlja -{"If You See What I Mean"}-). 
Pripada funkcionalnoj i imperativnoj programskoj paradigmi.

Pregled jezika 
 strogo tipiziran programski jezik - u osnovi -{ML}- jezika je lambda račun kojem je dodata stroga tipizacija.  Strogi sistem tipova pruža mogućnost za optimizaciju, tako da se uskoro pojavljuje kompilator jezika.
 poziv po vrednosti (eng. -{call-by-value}-) - funkciji se prosleđuju vrednosti promenljivih, koje se koriste u telu funkcije (rezultat rada funkcije zavisi od tih vrednosti), ali one same ne mogu biti promenjene
 funkcije višeg reda - uzima jednu ili više funkcija kao argumente (procesni parametri) i vraća funkciju kao rezultat. U lambda računu sve funkcije su višeg reda.
 automatsko upravljanje memorijom - osnovna forma automatskog upravljanja memorijom je sakupljač smeća (eng. -{garbage collection}-). On funkcioniše tako što pokušava da pokupi smeće ili memoriju okupiranu objektima koje program više ne koristi.
 parametarski polimorfizam - pomoću parametarskog polimorfizma funkcije ili tipovi podataka mogu biti napisani tako da se može prenositi vrednost. To su generičke funkcije, odnosno tipovi podataka.
 statički doseg - to znači da ne mogu da se menjaju vrednosti promenljivih, već može samo da im se pristupi. 
 upotreba Hindley Milner algoritma, koji može zaključivati tipove većine vrednosti bez zahtevanja iscrpnih anotacija.

Funkcija jezika 
-{ML}- je skraćenica od metajezik: bio je zamišljen za razvijanje metoda dokaza teorema.
Zbog dizajna i jednostavnog rukovanja podacima, koristi se prilikom programiranja prevodioca, analizatora, dokazivača teorema.
Kao programski jezik opšte namene, svoju primenu nalazi i u bioinformatici, finansijskim sistemima itd.
Ima odličnu podršku za algebarske tipove podataka (-{ADTs}-), što ga, zajedno sa idejom o razvijanju metoda dokaza, čini veoma pogodnim za programiranje nekih matematičkih softvera.

Veza sa drugim jezicima 
Glavni jezici koji pripadaju -{ML}--u su -{Standard ML}- -{(SML)}- i -{Caml}-. Osim njih, postoje i drugi - poput jezika -{F#}-, koji se koristi kao podrska -{Microsoftovoj .NET platformi}-.
Kao što je pomenuto na početku, zbog osobina koje ga karakterišu, -{ML}- ne pripada isključivo jednoj programskoj paradigmi. Pripada prvenstveno funkcionalnoj paradigmi, međutim, bez obzira na to što ohrabruje funkcionalno programiranje – on nije isključivo funkcionalan (poput jezika kao što je -{Haskell}-) jer on ne dozvoljava bočne efekte. Osim funkcionalnoj, -{ML}- pripada i imperativnoj paradigmi.

Kao predstavnik ove dve paradigme, on ima neke zajedničke osobine sa njihovim ostalim predstavnicima:
 jezici na koje je -{ML}- uticao: -{Haskell}-, -{Cyclone}-, -{Nemerle}- 
 jezici koji su uticali na nastanak i razvoj -{ML}- programskog jezika: -{Lisp}-

Prednosti i mane

Prednosti 
 portabilnost koda: program napisan na jednoj platformi može da se koristi (prenosi i izvršava) bilo gde – što je značajno zbog uniformnosti pisanja koda (samim tim se i izmene jednostavno vrše), ali, sa druge strane, arhitekturu određenog računara nećemo moći maksimalno da iskoristimo ovim uniformnim pristupom
 dizajn jezika: iako je strogo tipiziran, programeri uglavnom ne moraju da eksplicitno pišu deklaracije tipova – što kodove pisane u ovom programskom jeziku čini kompaktnim i veoma čitljivim (čitljivijim od mnogih čija sintaksa zahteva eksplicitnu deklaraciju tipova)
 ima odličnu podršku za algebarske tipove podataka, što ga čini veoma pogodnim za rad sa odgovarajućim matematičkim izrazima
 omogućena je jednostavna manipulacija podacima

Mane 
 mala baza korisnika
 slaba programska podrška (nedostatak -{IDE}--a, -{debugger}--a itd.)

Tipovi podataka 
Osnovni tipovi podataka su -{integer}- (celobrojni), -{real}- (realni), -{string}- (stringovni), -{boolean}- (logički). Od njih možemo konstruisati objekte korišćenjem torki, lista ili funkcija, a možemo kreirati i naše tipove.

Torke 
Torka je niz objekata mešovitog tipa. Primer torke: 
  (-{true,3.5,"abc"}-)

Liste 
Lista mora imati komponente istog tipa i mogu biti bilo koje dužine. Postoje dva konstruktora listi: prazna lista -{nil}- i operator :: . Konstruktor -{nil}- je lista koja ne sadrži ništa, operator :: uzima stavku sa leve strane i listu sa desne da bi vratio listu za jedan dužu od originalne. Primeri: 
  -{nil}-                              []  
  -{1::nil}-                          [1]  
  -{2::1::nil}-                     [2,1]

Operator @ se koristi za spajanje dve liste, na primer: 
  [1,2,3] @ [4,5,6] = [1,2,3,4,5,6]

Funkcije 
Funkcije se definišu korišćenjem ključne reči -{fun}-.

Definicija jednostavne funkcije ima formu: 
  -{fun <ime_funkcije> <parametri> = <izraz>}-; 

Primeri jednostavnih funkcija: 
  -{fun double x = 2*x}-;  
  -{fun inc x = x+1}-; 
  -{fun adda s = s ^ "a";}-  

Za izvršavanje funkcije jednostavno napišemo ime funkcije i u nastavku argument sa kojim pozivamo funkciju. Na primer: 
  -{double 6}-;  
  -{inc 100}-; 
  -{adda "tub"}-;  

Sistem vraća vrednosti:
  12 : -{int}-
  101 : -{int}-
  -{"tuba" : string }-

Primer rekurentne funkcije: 
  -{fun factorial 0 = 1  }-
  | -{factorial n = n * factorial(n-1); }-

Kada je argument funkcije 0, ona će vratiti broj 1. Za sve ostale slučajeve se izvršava druga linija. Ovo je rekurzija, pa se funkcija izvršava ponovo sve do baznog slučaja.

Reference

Spoljašnje veze 
 -{Standard ML of New Jersey}-
 -{MLton}-, optimizacija Standard ML kompajlera
 -{CakeML}-
 Uvod u ML kroz primere

Функционални програмски језици