OCaml/Cechy

Z Wikibooks, biblioteki wolnych podręczników.

Caml jest językiem statycznie typowanym, co oznacza tyle, że każda użyta w nim nazwa (funkcji, zmiennej, argumentu funkcji) ma określony ścisły typ, który podczas działania programu nie ulega zmianie. Ponadto programista nie musi (prawie nigdy) definiować typów używanych wyrażeń. W takim razie, można by spytać -- jak to działa? Zmienne mają określone typy, ale nikt nigdzie nie stwierdza jakie to są typy? Tak, dokładnie tak to wygląda.

Caml w trakcie kompilacji przeprowadza tzw. "type inferring", na podstawie sposobów w jaki używano zmiennej ustala jej typ. To wydawać się może bardzo proste, ale działa również dla typów złożonych, takich jak listy, rekordy, listy rekordów, obiekty. Działa również pomiędzy osobnymi plikami, bibliotekami Camla i modułami. Technika ta pozwala na uniknięcie wielu częstych błędów pojawiających się podczas pisania programów w językach bez silnego typowania (np. w PHP), w związku z tym przyspiesza tworzenie programów (również zwalniając programistę z obowiązku deklarowania zmiennych), przyspiesza wykonywanie programu przez dokładniejsze przeprowadzenie optymalizacji. Wprowadza ona też też jednak pewne niedogodności.

Jak i w wielu innych językach, mamy do dyspozycji zestaw podstawowych typów, jakimi są: int, float, char, string, bool oraz typ unit (oznaczany często dwoma nawiasami "()"), będący odpowiednikiem void z języka C. Podobnie jak w wielu innych językach pojedyncze znaki (typu char) otoczone są pojedynczym cudzysłowem, np. 'a', ciągi znaków podwójnym. Z typów podstawowych można zbudować inne typy takie jak listy, krotki (ang. tuples), rekordy, tablice, typy wariacyjne.

Aby móc rozróżnić pomiędzy typami całkowitymi i zmiennoprzecinkowymi w Camlu programista używa dwóch zestawów symboli dla operacji arytmetycznych. Jest to "+ - * /" dla liczb całkowitych (typ int), oraz te same symbole z dodaną do nich kropką: "+. -. *. /." dla operacji na typach float. W Camlu w przeciwieństwie do C nie istnieje tzw. "implicit casting", czyli automatyczne rzutowanie (konwersja) typów z jednego na drugi. Aby w C skonwertować integer na float, użylibyśmy zwykłego przypisania

float a; int b = 10;
a = b;

Co najwyżej możemy ręcznie uczynić to rzutowaniem jawnym (explicit cast), dodając:

a = (float) b;

Wielu programistów może nie zdawać sobie sprawy z tego, że konwersja liczby całkowitej na zmiennoprzecinkową nie jest taką całkiem tanią operacją. W tym języku wszystkie rzutowania są przeprowadzane jawnie. W standardowym module (który jest zawsze załączony do programu i nazywa się "Pervasives") dostępny jest szereg funkcji w postaci: string_of_int (konwertuje liczbę na ciąg znaków), int_of_string (w przeciwnym kierunku), int_of_float, float_of_int, itp.

Język funkcyjny charakteryzuje się tym, że funkcje są w nim obywatelami pierwszej klasy ("first-class citizens"). Można je w dowolnym miejscu tworzyć, przekazywać jak dowolne inne dane do innych funkcji. Poza tym każde wyrażenie używane w języku (np. warunki if) posiada swój typ.

To tyle jeśli chodzi o obowiązkowy wstęp. Resztę wiedzy dużo przyjemniej będzie sobie przyswoić poprzez przykłady.