Řídicí konstrukce v programovacím jazyku OCaml

27. 12. 2023
Doba čtení: 33 minut

Sdílet

 Autor: Depositphotos
Seznámíme se s většinou zbývajících řídicích konstrukcí, které v jazyku OCaml nalezneme. Jedná se o rozhodovací konstrukci a o dvě varianty smyček. Popíšeme si i zpracování seznamů funkcemi iter, map, map2 a fold_left.

Obsah

1. Řídicí konstrukce v programovacím jazyku OCaml

2. Rozhodovací konstrukce if-then-else

3. Náhrada if-then-else za pattern matching

4. Forma zápisu konstrukce if-then-else

5. Konstrukce if-else if-else

6. Náhrada za pattern matching s podmínkami

7. Větší množství příkazů ve větvích: blok begin-end

8. Programové smyčky v jazyku OCaml

9. Počítaná smyčka typu for

10. Vnořené počítané smyčky

11. Počítání směrem dolů

12. Vnořená podmínka uvnitř smyčky

13. Programová smyčka typu while

14. Korektní použití smyčky while

15. Iterace nad prvky seznamu

16. Operace typu zip zkombinovaná s průchodem seznamem

17. Postupná aplikace zvolené funkce na všechny prvky seznamu

18. Funkce vyššího řádu typu reduce

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Řídicí konstrukce v programovacím jazyku OCaml

V osmé části seriálu o programovacím jazyku OCaml se seznámíme s většinou zbývajících řídicích konstrukcí, které v tomto jazyku nalezneme. Kromě konstrukcí let a match (částečně sem spadá i and), které již dobře známe, se jedná o řídicí konstrukci if-then-else (která je součástí výrazu!), dále o blok begin-end a taktéž o dvojici programových smyček for a while. Přitom je pro jazyky z rodiny ML příznačné, že se o těchto řídicích konstrukcích zmiňujeme až po popisu pattern matchingu i typového systému jazyka (a nikoli hned v úvodním článku). Ve skutečnosti se totiž bez if-then-else i programových smyček poměrně dobře v praxi obejdeme, protože na mnoha místech lze alternativně využít pattern matching, rekurzi a standardní funkce vyššího řádu (map, fold_left, iter atd.).

2. Rozhodovací konstrukce if-then-else

Základní rozhodovací konstrukcí v mnoha programovacích jazycích je konstrukce if-then-else (což typicky znamená, že if, then a else jsou rezervovanými klíčovými slovy). V imperativních jazycích je většinou tato konstrukce chápána jako rozvětvení běhu programu, zatímco v jazycích funkcionálních se spíše jedná o výraz s podmínkou. A právě přístup, který můžeme znát z funkcionálních jazyků, je použit i v programovacím jazyku OCaml. I zde je tedy konstrukce if-then-else výrazem, který po vyhodnocení vrátí nějakou hodnotu.

S touto konstrukcí jsme se již setkali, a to například v realizaci rekurzivní funkce append určené pro spojení dvou seznamů. Výsledkem bude nový seznam, přičemž výpočet je jednoduchý – namísto původně prázdného seznamu můžeme vrátit druhý seznam, jinak vrátíme hlavu prvního seznamu spojenou s výsledkem spojení zbytku prvního seznamu se seznamem druhým (což je rekurze):

(* Naivní implementace funkce append *)
 
let rec append (x: 'a list) y =
  if x == [] then y
  else (List.hd x) :: (append (List.tl x) y)
;;
 
 
let print_list l =
  print_string (String.concat " " (List.map string_of_int l))
;;
 
 
print_list (append [] [1; 2; 3]);;
print_list (append [1; 2; 3] []);;
print_list (append [1; 2; 3] [4; 5]);;
print_list (append [] []);;

Výsledky:

print_list (append [] [1; 2; 3]) ;;
1 2 3
- : unit = ()
 
print_list (append [1; 2; 3] []) ;;
1 2 3
- : unit = ()
 
print_list (append [1; 2; 3] [4; 5]) ;;
1 2 3 4 5
- : unit = ()
 
print_list (append [] []) ;;
 
- : unit = ()

3. Náhrada if-then-else za pattern matching

V jazycích odvozených od ML (tedy i v OCamlu a F#) se ovšem častěji namísto využití konstrukce if-then-else setkáme spíše s pattern matchingem. Algoritmus realizovaný v předchozí kapitole můžeme přepsat i do následující (idiomatičtější) podoby:

(* Implementace funkce append založená na pattern matchingu *)
 
let rec append x y =
    match x with
    | [] -> y
    | head :: tail -> head :: append tail y
;;
 
 
let print_list l =
  print_string (String.concat " " (List.map string_of_int l))
;;
 
 
print_list (append [] [1; 2; 3]);;
print_list (append [1; 2; 3] []);;
print_list (append [1; 2; 3] [4; 5]);;
print_list (append [] []);;

Výsledky přitom budou totožné s příkladem z předchozí kapitoly:

print_list (append [] [1; 2; 3]) ;;
1 2 3
- : unit = ()
 
print_list (append [1; 2; 3] []) ;;
1 2 3
- : unit = ()
 
print_list (append [1; 2; 3] [4; 5]) ;;
1 2 3 4 5
- : unit = ()
 
print_list (append [] []) ;;
 
- : unit = ()

4. Forma zápisu konstrukce if-then-else

Konstrukci if-then-else, což je – jak již víme – výraz, lze zapsat různými způsoby. Setkáme se například s tím, že if a else jsou na samostatných řádcích:

let rec fib n =
  if n <= 1 then n
  else fib (n-1) + fib (n-2)
;;
 
 
fib 0;;
fib 1;;
fib 2;;
fib 10;;
fib 20;;

Ovšem i následující „blokový“ způsob zápisu se používá poměrně často:

let rec fib n =
  if n <= 1 then
      n
  else
      fib (n-1) + fib (n-2)
;;
 
 
fib 0;;
fib 1;;
fib 2;;
fib 10;;
fib 20;;

Setkáme se naopak i se zápisem na jediném řádku:

let rec fib n =
  if n <= 1 then n else fib (n-1) + fib (n-2)
;;
 
 
fib 0;;
fib 1;;
fib 2;;
fib 10;;
fib 20;;

I tento algoritmus je však možné zapsat elegantněji s využitím pattern matchingu:

let rec fib n =
  match n with
    0 -> 0
  | 1 -> 1
  | n -> fib (n-1) + fib (n-2)
;;

Vzhledem k tomu, že funkce fib má jen jediný argument a jejím tělem je konstrukce match, lze zápis ještě více zkrátit a založit ho na klíčovém slovu function:

let rec fib = function
    0 -> 0
  | 1 -> 1
  | n -> fib (n-1) + fib (n-2)
;;
 
 
fib 0;;
fib 1;;
fib 2;;
fib 10;;
fib 20;;

Setkáme se ovšem i se vzorkem (pattern), v němž je použit zápis s „or“ a zachycením hodnoty do pomocného lokálního symbolu (zde konkrétně symbolu x):

let rec fib = function
  | 0 | 1 as x -> x
  | n -> fib (n-1) + fib (n-2)
;;
 
 
fib 0;;
fib 1;;
fib 2;;
fib 10;;
fib 20;;

5. Konstrukce if-else if-else

V poměrně mnoha situacích je nutné se rozhodovat nikoli pouze na základě jednoho logického výrazu (s výsledkem true či false), ale na několika různých podmínkách. Typicky se provádí rozhodování mezi třemi možnými variantami. Příkladem může být funkce, která na základě hodnoty svého celočíselného argumentu x vrátí řetězec „positive“, „negative“ nebo „zero“. A právě v takových situacích se setkáme s použitím else if, tedy spojení větve else z první části výrazu s dalším rozhodovacím výrazem (programovací jazyk OCaml neobsahuje klíčová slova elseif ani elif):

let classify x =
  if x > 0 then "positive"
  else if x < 0 then "negative"
  else "zero"
;;
 
 
classify (-10);;
classify (-1);;
classify 0;;
classify 1;;
classify 10;;

Pro jistotu zkontrolujeme výsledky:

classify (-10) ;;
- : string = "negative"
 
classify (-1) ;;
- : string = "negative"
 
classify 0 ;;
- : string = "zero"
 
classify 1 ;;
- : string = "positive"
 
classify 10 ;;
- : string = "positive"

6. Náhrada za pattern matching s podmínkami

Pravděpodobně nebude velkým překvapením, že i rozhodovací konstrukci z předchozí kapitoly budeme moci přepsat tak, aby se využil pattern matching. Nyní již ovšem musí být ve vzorku uvedena i podmínka, což je realizováno klíčovým slovem when (naschvál se liší od klíčového slova if). První varianta přepisu používá plnou deklaraci funkce:

let classify x =
  match x with
  | x when x < 0 -> "negative"
  | x when x > 0 -> "positive"
  | x -> "zero"
;;

Idiomatičtější je však (opět) využití klíčového slova function s odstraněním názvu (jediného) argumentu funkce a tím pádem i začátku bloku match:

let classify = function
  | x when x < 0 -> "negative"
  | x when x > 0 -> "positive"
  | x -> "zero"
;;
 
 
classify (-10);;
classify (-1);;
classify 0;;
classify 1;;
classify 10;;

Výsledky by měly být stále totožné:

classify (-10) ;;
- : string = "negative"
 
classify (-1) ;;
- : string = "negative"
 
classify 0 ;;
- : string = "zero"
 
classify 1 ;;
- : string = "positive"
 
classify 10 ;;
- : string = "positive"

7. Větší množství příkazů ve větvích: blok begin-end

V případě, že je nutno ve větvi then či else realizovat větší množství příkazů, nemůžeme tyto příkazy pouze zapsat za sebe. V takovém případě by totiž překladač jazyka OCaml nedokázal rozpoznat konec takové větve. Namísto toho musíme do větve vložit blok begin-end. Jednotlivé příkazy v bloku jsou odděleny středníkem a před klíčovým slovem end je zapsán výraz, který se (po vyhodnocení) stane návratovou hodnotou celého bloku. Nesmíme totiž zapomenout na to, že if-then-else je taktéž výrazem:

begin
  příkaz;
  příkaz;
  výraz
end

Demonstrační příklad z předchozí kapitoly si nyní upravíme takovým způsobem, že ve větvi „x je nulové“ nejprve vypíšeme na terminál zprávu (to je příkaz) a teprve poté vrátíme řetězec „zero“ (to je konstantní výraz):

let classify x =
  if x > 0 then "positive"
  else if x < 0 then "negative"
  else begin
    print_string "Zero value detected";
    "zero"
  end
;;
 
classify (-10);;
classify (-1);;
classify 0;;
classify 1;;
classify 10;;

Alternativně je samozřejmě možné program zapsat nepatrně odlišně a s jiným odsazením. Logika však zůstává zachována:

let classify x =
  if x > 0 then
      "positive"
  else
  if x < 0 then
      "negative"
  else begin
    print_string "Zero value detected";
    "zero"
  end
;;
 
classify (-10);;
classify (-1);;
classify 0;;
classify 1;;
classify 10;;

Výsledky (včetně explicitního tisku na terminál):

classify (-10) ;;
- : string = "negative"
 
classify (-1) ;;
- : string = "negative"
 
classify 0 ;;
Zero value detected
- : string = "zero"
 
classify 1 ;;
- : string = "positive"
 
classify 10 ;;
- : string = "positive"

8. Programové smyčky v jazyku OCaml

V programovacím jazyku OCaml nalezneme dva typy programových smyček. V první řadě se jedná o smyčku for, která zde existuje v „počítané“ variantě – součástí smyčky je i počitadlo, jehož hodnota se zvyšuje, popř. snižuje o jedničku. S touto programovou smyčkou se setkáme relativně často i v praxi. A druhým typem programové smyčky je smyčka typu while (tedy smyčka s podmínkou vyhodnocovanou před vstupem do smyčky). Tato smyčka má, jak uvidíme dále, poměrně velké množství nevýhod, takže se v praxi příliš často nepoužívá.

9. Počítaná smyčka typu for

Nejjednodušším a pravděpodobně i nejčastěji používaným typem programové smyčky v jazyku OCaml je počítaná smyčka typu for. V této smyčce se pracuje s počitadlem, které je – což je poněkud zvláštní – měnitelné (mutable), ovšem jen nepřímo (vlastní smyčkou). U počitadla se zadává jeho počáteční hodnota, a za klíčovým slovem to koncová hodnota. Na rozdíl od mnoha dalších programovacích jazyků dosáhne počitadlo obou krajních hodnot (počítá tedy „včetně“):

for n = 0 to 10 do
  print_int n;
  print_string "\n";
done

Povšimněte si, že počitadlo začalo na hodnotě 0 (jako v jiných jazycích) a skončilo až na hodnotě 10 (u některých dalších jazyků by to byla hodnota 9):

Poznámka: příkazy v těle smyčky jsou odděleny středníkem. To znamená, že středník za posledním příkazem se nemusí uvádět (není použit pro ukončení příkazu):
for n = 0 to 10 do
  print_int n;
  print_string "\n"
done

Výsledky obou variant musí být totožné:

0
1
2
3
4
5
6
7
8
9
10

10. Vnořené počítané smyčky

Programové smyčky, samozřejmě i včetně smyček typu for, můžeme vnořovat tak, jak je to známé i z dalších programovacích jazyků. Pouze nesmíme zapomenout na klíčové slovo done, za nímž se ovšem musí napsat středník, pokud tělo vnější smyčky pokračuje:

for x = 0 to 10 do
  for y = 0 to 10 do
    let z = x*y in
    print_int z;
    print_string "\t";
  done;
  print_string "\n";
done

Alternativní zápis bez středníků u posledních příkazů smyček:

for x = 0 to 10 do
  for y = 0 to 10 do
    let z = x*y in
    print_int z;
    print_string "\t"
  done;
  print_string "\n"
done

Oba příklady po svém spuštění vypíšou tabulku malé násobilky:

0       0       0       0       0       0       0       0       0       0       0
0       1       2       3       4       5       6       7       8       9       10
0       2       4       6       8       10      12      14      16      18      20
0       3       6       9       12      15      18      21      24      27      30
0       4       8       12      16      20      24      28      32      36      40
0       5       10      15      20      25      30      35      40      45      50
0       6       12      18      24      30      36      42      48      54      60
0       7       14      21      28      35      42      49      56      63      70
0       8       16      24      32      40      48      56      64      72      80
0       9       18      27      36      45      54      63      72      81      90
0       10      20      30      40      50      60      70      80      90      100

11. Počítání směrem dolů

V případě, že se má hodnota počitadla snižovat (o jedničku!) a nikoli zvyšovat, postačuje namísto klíčového slova to použít klíčové slovo downto. Otočenou tabulku malé násobilky tedy získáme takto:

for x = 10 downto 0 do
  for y = 10 downto 0 do
    let z = x*y in
    print_int z;
    print_string "\t";
  done;
  print_string "\n";
done

S výsledkem:

100     90      80      70      60      50      40      30      20      10      0
90      81      72      63      54      45      36      27      18      9       0
80      72      64      56      48      40      32      24      16      8       0
70      63      56      49      42      35      28      21      14      7       0
60      54      48      42      36      30      24      18      12      6       0
50      45      40      35      30      25      20      15      10      5       0
40      36      32      28      24      20      16      12      8       4       0
30      27      24      21      18      15      12      9       6       3       0
20      18      16      14      12      10      8       6       4       2       0
10      9       8       7       6       5       4       3       2       1       0
0       0       0       0       0       0       0       0       0       0       0
Poznámka: pozor na to, že pokud pouze změníme počáteční a koncovou hodnotu počitadla a nikoli i klíčové slovo to na downto, neprovede se smyčka ani jedenkrát:
for x = 10 to 0 do
  for y = 10 to 0 do
    let z = x*y in
    print_int z;
    print_string "\t";
  done;
  print_string "\n";
done

12. Vnořená podmínka uvnitř smyčky

Uvnitř programové smyčky (a pochopitelně i vnořené programové smyčky) samozřejmě můžeme zapsat podmínku. Smyčka není výrazem (nic nevrací – resp. vrací hodnotu typu unit), takže i podmínka se zde používá spíše ve funkci příkazu a nikoli výrazu. Ukažme si toto chování na příkladu, v němž vypíšeme ty hodnoty malé násobilky, které jsou větší než 10:

for x = 0 to 10 do
  for y = 0 to 10 do
    let z = x*y in
    if z > 10 then begin
      print_int z;
      print_string "\t"
    end
  done;
  print_string "\n";
done

Výsledek získaný po spuštění takto upraveného příkladu:

12      14      16      18      20
12      15      18      21      24      27      30
12      16      20      24      28      32      36      40
15      20      25      30      35      40      45      50
12      18      24      30      36      42      48      54      60
14      21      28      35      42      49      56      63      70
16      24      32      40      48      56      64      72      80
18      27      36      45      54      63      72      81      90
20      30      40      50      60      70      80      90      100

13. Programová smyčka typu while

V programovacím jazyku OCaml nalezneme i programovou smyčku typu while, v níž se podmínka pro ukončení smyčky testuje před každým vstupem do jejího těla. Ovšem s tímto typem smyčky se v praxi příliš často nesetkáme. Jedním z důvodů je fakt, že se ve smyčce typicky používá nějaká řídicí proměnná. A vzhledem k tomu, že standardní proměnné jsou v OCamlu neměnitelné (immutable), je nutné namísto nich použít reference. Ostatně pokusme se spustit následující program, který je založen na použití standardní neměnitelné proměnné:

let x = 0 in
while x <= 10 do
  print_int x;
  print_string "\n";
  x = x + 1;
done
;;

Tento program sice vypadá korektně, jenže se ve skutečnosti jedná o nekonečnou smyčku! Hodnota proměnná x se nemění (a u příkazu na čtvrtém řádku se navíc vypíše varování).

14. Korektní použití smyčky while

Korektní implementace programové smyčky s řídicí proměnnou x (typu reference) vypadá následovně:

let x = ref 0 in
while !x <= 10 do
  print_int !x;
  print_string "\n";
  x := !x + 1;
done
;;

Už ze zápisu je patrné, jak je práce s měnitelnými proměnnými nepříjemná a proč se jim programátoři používající programovací jazyk OCaml vyhýbají.

15. Iterace nad prvky seznamu

Už v úvodní kapitole jsme si řekli, že v OCamlu se programové smyčky používají spíše zřídka. Je tomu tak z toho důvodu, že si mnohdy vystačíme s rekurzí a taktéž s funkcemi (vyššího řádu) určenými pro procházení sekvenčních datových typů, tedy typicky seznamů a polí.

Příkladem je funkce List.iter, která nám umožňuje procházet všemi prvky seznamu a pro každý prvek volat předanou funkci. Pokud například budeme chtít vypsat všechny prvky seznamu na terminál, můžeme použít tento zápis:

let uzivatele = ["Adam"; "Bozena"; "Cyril"; "Dana"] in
List.iter print_endline uzivatele
;;

Tento krátký prográmek po svém spuštění vypíše na standardní výstup čtyři řádky se čtyřmi jmény (a to bez použití programové smyčky):

Adam
Bozena
Cyril
Dana

16. Operace typu zip zkombinovaná s průchodem seznamem

V mnoha programovacích jazycích se můžeme setkat s operací typu zip, která umožní zkombinovat prvky z několika sekvencí (například ze dvou seznamů). Pokud budeme chtít, aby se zkombinovaly prvky ze dvou seznamů v jazyku OCaml a aby se výsledné dvojice například vypsaly na terminál, můžeme pro tento účel použít funkci vyššího řádu List.iter2. Této funkci se předá libovolná volaná funkce (akceptující dva parametry s korektními typy!) a taktéž dva vstupní seznamy. List.iter2 zajistí průchod oběma seznamy, přičemž se pro dvojici n-tých prvků z obou seznamů zavolá specifikovaná funkce:

let print_user id user =
  print_int id;
  print_char ':';
  print_string user;
  print_char '\n';
;;
 
let uzivatele = ["Adam"; "Bozena"; "Cyril"; "Dana"] in
let ids = [1; 2; 3; 4] in
List.iter2 print_user ids uzivatele
;;

Po spuštění tohoto programu se na terminál vypíšou ID uživatelů následovaná jejich jmény:

1:Adam
2:Bozena
3:Cyril
4:Dana

17. Postupná aplikace zvolené funkce na všechny prvky seznamu

Ve standardní knihovně programovacího jazyka OCaml nalezneme i funkci vyššího řádu typu map. Její varianta určená pro zpracování seznamů, která se jmenuje List.map, dovoluje aplikovat uživatelem zvolenou funkci postupně na všechny prvky seznamu. Výsledkem bude nový seznam, pochopitelně korektního typu (což je důležité):

let inc x =
  x+1
;;
 
let values = [1; 2; 3; 4] in
List.map inc values
;;

Pokud tento příklad spustíme, získáme seznam s prvky typu int:

List.map inc values ;;
- : int list = [2; 3; 4; 5]

18. Funkce vyššího řádu typu reduce

Ve standardní knihovně programovacího jazyka OCaml nechybí ani funkce vyššího řádu typu reduce. Ovšem v jazyku OCaml se namísto označení reduce používá explicitnější označení fold_left a fold_right podle toho, z jaké strany se prvky sekvence (typicky seznamu) „redukují“. Příkladem může být součet všech prvků uložených v seznamu, přičemž operace součtu je představována funkcí nazvanou +. Výchozí hodnota akumulátoru bude 0:

bitcoin školení listopad 24

let values = [1; 2; 3; 4] in
List.fold_left ( + ) 0 values
;;

Naopak součin všech prvků ze seznamu lze realizovat takto:

let values = [1; 2; 3; 4] in
List.fold_left ( * ) 1 values
;;

19. Repositář s demonstračními příklady

Všechny výše popsané demonstrační příklady byly uloženy do repositáře dostupného na adrese https://github.com/tisnik/ocaml-examples/. V tabulce umístěné pod tímto odstavcem jsou uvedeny odkazy na tyto příklady:

# Příklad Popis příkladu Cesta
1 article01/hello_world1.ml zavolání funkce print_string https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/hello_world1.ml
2 article01/hello_world2.ml zavolání funkce printf.Printf https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/hello_world2.ml
       
3 article01/function.ml definice funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/function.ml
4 article01/lambda.ml anonymní funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/lambda.ml
       
5 article01/function_type1.ml explicitní specifikace typu návratové hodnoty funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/function_type1.ml
6 article01/function_type2.ml explicitní specifikace typu návratové hodnoty funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/function_type2.ml
       
7 article01/call_function1.ml definice jednoduché funkce s jejím zavoláním https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/call_function1.ml
8 article01/call_function2.ml definice jednoduché funkce s jejím zavoláním https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/call_function2.ml
9 article01/call_function3.ml použití operátoru + pro dvojici hodnot typu float https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/call_function3.ml
10 article01/call_function4.ml použití operátoru +. pro dvojici hodnot typu float https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/call_function4.ml
11 article01/call_function5.ml plná deklarace funkce bez syntaktického cukru https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/call_function5.ml
12 article01/call_function6.ml plná deklarace funkce bez syntaktického cukru https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/call_function6.ml
       
13 article01/local_binding1.ml definice lokálních symbolů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/local_binding1.ml
14 article01/local_binding2.ml definice lokálních symbolů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle01/local_binding2.ml
       
15 article02/basic_binding.ml navázání hodnoty na symbol (deklarace proměnné) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/basic_binding.ml
16 article02/print_variable.ml tisk hodnoty proměnné https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/print_variable.ml
17 article02/variables_and_functions.ml předání proměnné do funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/variables_and_functi­ons.ml
18 article02/redefine_symbol1.ml pokus o redefinici symbolu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/redefine_symbol1.ml
19 article02/redefine_symbol2.ml pokus o redefinici symbolu (složitější příklad) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/redefine_symbol2.ml
       
20 article02/requal_operator1.ml operátor = https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/equal_operator1.ml
21 article02/requal_operator2.ml operátor = https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/equal_operator2.ml
       
22 article02/immutable_variable.ml „změna“ neměnitelné proměnné https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/immutable_variable.ml
22 article02/mutable_variable.ml změna měnitelné proměnné https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/mutable_variable.ml
23 article02/shadow.ml shadowing symbolu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/shadow.ml
24 article02/incr.ml standardní funkce incr https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/incr.ml
25 article02/ident.ml nejjednodušší polymorfická funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/ident.ml
       
26 article02/tuple1.ml datový typ n-tice (tuple) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/tuple1.ml
27 article02/tuple2.ml datový typ n-tice (tuple) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/tuple2.ml
28 article02/record1.ml datový typ záznam (record), deklarace proměnné tohoto typu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/record1.ml
29 article02/record2.ml datový typ záznam (record) a typová inference https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/record2.ml
       
30 article02/unit.ml datový typ unit a rozdíl oproti funkcím bez parametrů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/unit.ml
31 article02/polymorphic.ml použití polymorfických funkcí https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/polymorphic.ml
32 article02/two_same_records.ml dva datové typy záznam se shodnými prvky https://github.com/tisnik/ocaml-examples/tree/master/arti­cle02/two_same_records.ml
       
72 article04/none_value.ml hodnota None https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/none_value.ml
73 article04/some_value1.ml hodnota Some(typ) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/some_value1.ml
74 article04/some_value2.ml hodnota Some(typ) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/some_value2.ml
75 article04/some_value3.ml hodnota Some(typ) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/some_value3.ml
76 article04/option_exists1.ml základní pattern matching, korektní varianta https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_exists1.ml
77 article04/option_exists2.ml základní pattern matching, nekorektní varianta https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_exists2.ml
78 article04/option_exists3.ml základní pattern matching, nekorektní varianta https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_exists3.ml
79 article04/find_in_list1.ml vyhledávání prvku v seznamu založené na pattern matchingu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/find_in_list1.ml
80 article04/find_in_list2.ml varianta předchozího programu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/find_in_list2.ml
81 article04/option_get.ml pokus o přečtení hodnoty obalené typem Option https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_get.ml
82 article04/is_none_is_some.ml predikáty is_none a is_some https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/is_none_is_some.ml
83 article04/option_equal.ml ekvivalence dvou obalených hodnot https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_equal.ml
84 article04/some_none.ml obalení obalené hodnoty https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/some_none.ml
       
85 article04/result_divide1.ml ukázka použití datového typu Result https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/result_divide1.ml
86 article04/result_divide2.ml ukázka použití datového typu Result a pattern matchingu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/result_divide2.ml
87 article04/result_divide3.ml stejné jako result_divide1.fs, ovšem bez explicitního zápisu typů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/result_divide3.ml
88 article04/result_divide4.ml stejné jako result_divide2.fs, ovšem bez explicitního zápisu typů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/result_divide4.ml
       
89 article04/array_value.ml deklarace pole výčtem jeho prvků https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_value.ml
90 article04/array_make.ml funkce Array.make pro konstrukci pole https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_make.ml
91 article04/array_init1.ml inicializace prvků pole funkcí Array.init https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_init1.ml
92 article04/array_init2.ml inicializace prvků pole funkcí Array.init https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_init2.ml
93 article04/array_init3.ml inicializace prvků pole funkcí Array.init https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_init3.ml
94 article04/array_indexing.ml indexování prvků pole https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_indexing.ml
95 article04/array_mutation.ml mutace pole: modifikace hodnot jeho prvků https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/array_mutation.ml
       
96 article04/option_no_bind.ml zřetězení volání funkcí, které si předávají hodnoty typu Option – neidiomatické řešení https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_no_bind.ml
97 article04/option_bind.ml řešení založené na bind https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/option_bind.ml
98 article04/bind_infix_operator.ml funkce Option.bind zapsaná formou infixového operátoru https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/bind_infix_operator­.ml
99 article04/bind_infix_operator2.ml zřetězení funkcí s využitím Result.bind https://github.com/tisnik/ocaml-examples/tree/master/arti­cle04/bind_infix_operator.ml
       
100 article05/unary_arithmetic.ml unární aritmetické operátory https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/unary_arithmetic.ml
101 article05/binary_arithmetic.ml binární aritmetické operátory https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/binary_arithmetic.ml
102 article05/boolean_operators.ml booleovské operátory https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/boolean_operators.ml
103 article05/relational.ml základní čtveřice relačních operátorů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/relational.ml
104 article05/equality.ml operátory zjišťující ekvivalenci hodnot https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/equality.ml
105 article05/joins.ml operátory pro spojení řetězců a seznamů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/joins.ml
106 article05/references.ml operátory pro práci s referencemi https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/references.ml
107 article05/function_operators.ml operátory pro aplikaci funkcí https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/function_operators.ml
108 article05/conwoy.ml konvoj vytvořený operátorem |> https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/conwoy.ml
       
109 article05/usage_unary_arithmetic.ml test unárních operátorů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_unary_arithme­tic.ml
110 article05/usage_binary_arithmetic.ml test binárních operátorů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_binary_arithme­tic.ml
111 article05/usage_boolean.ml test booleovských operátorů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_boolean.ml
112 article05/usage_relational.ml test relačních operátorů vůči různým hodnotám https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_relational.ml
113 article05/usage_relational_tuples.ml test relačních operátorů vůči n-ticím https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_relational_tu­ples.ml
114 article05/usage_equality.ml testy na strukturální a fyzickou rovnost https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_equality.ml
115 article05/usage_joins.ml testy operátorů pro spojení řetězců a seznamů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_joins.ml
116 article05/usage_function.ml testy operátorů pro aplikaci funkcí https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/usage_function.ml
       
117 article05/operator_unary1.ml vlastní unární operátor https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/operator_unary1.ml
118 article05/operator_unary2.ml vlastní unární operátory https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/operator_unary2.ml
119 article05/operator_binary1.ml vlastní binární operátor s asociativitou zleva https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/operator_binary1.ml
120 article05/operator_binary2.ml vlastní binární operátor s asociativitou zprava https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/operator_binary2.ml
121 article05/operator_binary3.ml vlastní binární operátory s rozdílnou prioritou https://github.com/tisnik/ocaml-examples/tree/master/arti­cle05/operator_binary3.ml
       
122 article06/circle_rectangle1.ml datový typ přestavující buď kružnici nebo obdélník https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/circle_rectangle1.ml
123 article06/circle_rectangle2.ml datový typ přestavující buď kružnici nebo obdélník https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/circle_rectangle2.ml
124 article06/enum1.ml příklad použití datového typu výčet https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/enum1.ml
125 article06/enum2.ml příklad použití datového typu výčet https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/enum2.ml
126 article06/expr.ml datový typ představující rekurzivní definici výrazu (expression) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/expr.ml
       
127 article06/object1.ml jednoduchá třída s dvojicí atributů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/object1.ml
128 article06/object2.ml přidání metody do třídy https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/object2.ml
129 article06/object3.ml metoda vytvářející nový objekt https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/object3.ml
130 article06/object4.ml doplnění předchozí třídy o přetížený operátor + https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/object4.ml
131 article06/object5.ml doplnění předchozí třídy o přetížený operátor + s automatickým odvozením typu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/object5.ml
       
132 article06/rectangle1.ml typ Rectangle založený na n-tici https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/rectangle1.ml
133 article06/rectangle2.ml úprava předchozího příkladu; pattern matching https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/rectangle2.ml
134 article06/rectangle3.ml úprava předchozího příkladu, explicitní pojmenování https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/rectangle3.ml
135 article06/rectangle4.ml různé jmenné prostory https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/rectangle4.ml
       
136 article06/struct_type1.ml definice záznamu (record, struct) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/struct_type1.ml
137 article06/struct_type2.ml rozšíření o funkci pro tisk záznamu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/struct_type2.ml
138 article06/struct_type3.ml automatické odvození datového typu parametru funkce https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/struct_type3.ml
139 article06/struct_type4.ml otestování mezí automatického odvozování typů parametrů (nefunkční varianta) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/struct_type4.ml
140 article06/struct_type5.ml otestování mezí automatického odvozování typů parametrů (funkční varianta) https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/struct_type5.ml
141 article06/tree.ml datový typ představující rekurzivní definici binárního stromu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle06/tree.ml
       
142 article07/color-type-1.ml definice typu basic_color https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-1.ml
143 article07/color-type-2.ml definice typu color a funkce pro převod na RGB https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-2.ml
144 article07/color-type-3.ml úplná funkce pro převod základních barev na RGB https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-3.ml
145 article07/color-type-4.ml přidání datového typu Gray https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-4.ml
146 article07/color-type-5.ml přidání datového typu RGB https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-5.ml
147 article07/color-type-6.ml převod RGB na RGB (pattern matching) https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-6.ml
148 article07/color-type-7.ml možnost specifikace světlosti libovolné základní barvy https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-7.ml
149 article07/color-type-8.ml refactoring předchozího příkladu https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-8.ml
150 article07/color-type-9.ml podpora pro barvový prostor HSV https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-9.ml
151 article07/color-type-A.ml refactoring předchozího příkladu: použití function https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-A.ml
152 article07/color-type-B.ml podpora pro mix dvou barev se specifikací poměru obou barev https://github.com/tisnik/ocaml-examples/tree/master/article07/color-type-B.ml
153 article07/hsv-to-rgb.ml převod barvy z prostoru HSV to RGB https://github.com/tisnik/ocaml-examples/tree/master/article07/hsv-to-rgb.ml
       
154 article08/append1.ml operace připojení prvku k seznamu, řešeno pomocí if-then https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/append1.ml
155 article08/append2.ml operace připojení prvku k seznamu, řešeno pomocí pattern matchingu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/append2.ml
156 article08/fibonacci1.ml výpočet n-tého prvku Fibonacciho posloupnosti, řešeno pomocí if-then https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/fibonacci1.ml
157 article08/fibonacci2.ml předchozí příklad, ale jinak naformátovaný https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/fibonacci2.ml
158 article08/fibonacci3.ml výpočet n-tého prvku Fibonacciho posloupnosti, řešeno pomocí pattern matchingu https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/fibonacci3.ml
159 article08/fibonacci4.ml předchozí příklad, ale se spojenými dvěma větvemi https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/fibonacci4.ml
160 article08/for_loop1.ml jednoduchá forma počítané smyčky for https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/for_loop1.ml
161 article08/for_loop2.ml vnořené počítané smyčky for https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/for_loop2.ml
162 article08/for_loop3.ml vnořené počítané smyčky for, počítání směrem dolů https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/for_loop3.ml
163 article08/for_loop4.ml vnořené počítané smyčky, vnořená podmínka a blok let https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/for_loop4.ml
164 article08/pos_neg_zero1.ml konstrukce if-else if-else https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/pos_neg_zero1.ml
165 article08/pos_neg_zero2.ml předchozí příklad řešený pattern matchingem https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/pos_neg_zero2.ml
166 article08/pos_neg_zero3.ml vnořené konstrukce if-else if-else s blokem begin https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/pos_neg_zero3.ml
167 article08/pos_neg_zero4.ml předchozí příklad, ale jinak naformátovaný https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/pos_neg_zero4.ml
168 article08/while_loop1.ml nekorektní podoba programové smyčky typu while https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/while_loop1.ml
169 article08/while_loop2.ml korektní podoba programové smyčky typu while https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/while_loop2.ml
170 article08/list_iter.ml iterace nad všemi prvky seznamu bez použití programové smyčky https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/list_iter.ml
171 article08/zip.ml varianta funkce typu zip aplikované na dva seznamy https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/zip.ml
172 article08/fold_left.ml funkce vyššího řádu typu reduce aplikovaná na seznam https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/fold_left.ml
173 article08/map.ml funkce vyššího řádu typu map aplikovaná na seznam https://github.com/tisnik/ocaml-examples/tree/master/arti­cle08/map.ml

20. Odkazy na Internetu

  1. General-Purpose, Industrial-Strength, Expressive, and Safe
    https://ocaml.org/
  2. OCaml playground
    https://ocaml.org/play
  3. Online Ocaml Compiler IDE
    https://www.jdoodle.com/compile-ocaml-online/
  4. Get Started – OCaml
    https://www.ocaml.org/docs
  5. Get Up and Running With OCaml
    https://www.ocaml.org/docs/up-and-running
  6. Better OCaml (Online prostředí)
    https://betterocaml.ml/?ver­sion=4.14.0
  7. OCaml file extensions
    https://blog.waleedkhan.name/ocaml-file-extensions/
  8. First thoughts on Rust vs OCaml
    https://blog.darklang.com/first-thoughts-on-rust-vs-ocaml/
  9. Standard ML of New Jersey
    https://www.smlnj.org/
  10. Programming Languages: Standard ML – 1 (a navazující videa)
    https://www.youtube.com/wat­ch?v=2sqjUWGGzTo
  11. 6 Excellent Free Books to Learn Standard ML
    https://www.linuxlinks.com/excellent-free-books-learn-standard-ml/
  12. SOSML: The Online Interpreter for Standard ML
    https://sosml.org/
  13. ML (Computer program language)
    https://www.barnesandnoble­.com/b/books/other-programming-languages/ml-computer-program-language/_/N-29Z8q8Zvy7
  14. Strong Typing
    https://perl.plover.com/y­ak/typing/notes.html
  15. What to know before debating type systems
    http://blogs.perl.org/user­s/ovid/2010/08/what-to-know-before-debating-type-systems.html
  16. Types, and Why You Should Care (Youtube)
    https://www.youtube.com/wat­ch?v=0arFPIQatCU
  17. DynamicTyping (Martin Fowler)
    https://www.martinfowler.com/bli­ki/DynamicTyping.html
  18. DomainSpecificLanguage (Martin Fowler)
    https://www.martinfowler.com/bli­ki/DomainSpecificLanguage­.html
  19. Language Workbenches: The Killer-App for Domain Specific Languages?
    https://www.martinfowler.com/ar­ticles/languageWorkbench.html
  20. Effective ML (Youtube)
    https://www.youtube.com/watch?v=-J8YyfrSwTk
  21. Why OCaml (Youtube)
    https://www.youtube.com/wat­ch?v=v1CmGbOGb2I
  22. Try OCaml
    https://try.ocaml.pro/
  23. CSE 341: Functions and patterns
    https://courses.cs.washin­gton.edu/courses/cse341/04wi/lec­tures/03-ml-functions.html
  24. Comparing Objective Caml and Standard ML
    http://adam.chlipala.net/mlcomp/
  25. What are the key differences between Standard ML and OCaml?
    https://www.quora.com/What-are-the-key-differences-between-Standard-ML-and-OCaml?share=1
  26. Cheat Sheets (pro OCaml)
    https://www.ocaml.org/doc­s/cheat_sheets.html
  27. Think OCaml: How to Think Like a (Functional) Programmer
    https://www.greenteapress­.com/thinkocaml/thinkocam­l.pdf
  28. The OCaml Language Cheat Sheet
    https://ocamlpro.github.io/ocaml-cheat-sheets/ocaml-lang.pdf
  29. Syllabus (FAS CS51)
    https://cs51.io/college/syllabus/
  30. Abstraction and Design In Computation
    http://book.cs51.io/
  31. Learn X in Y minutes Where X=Standard ML
    https://learnxinyminutes.com/doc­s/standard-ml/
  32. CSE307 Online – Summer 2018: Principles of Programing Languages course
    https://www3.cs.stonybrook­.edu/~pfodor/courses/summer/cse307­.html
  33. CSE307 Principles of Programming Languages course: SML part 1
    https://www.youtube.com/wat­ch?v=p1n0_PsM6hw
  34. CSE 307 – Principles of Programming Languages – SML
    https://www3.cs.stonybrook­.edu/~pfodor/courses/summer/CSE307/L01_SML­.pdf
  35. SML, Some Basic Examples
    https://cs.fit.edu/~ryan/sml/in­tro.html
  36. History of programming languages
    https://devskiller.com/history-of-programming-languages/
  37. History of programming languages (Wikipedia)
    https://en.wikipedia.org/wi­ki/History_of_programming_lan­guages
  38. Jemný úvod do rozsáhlého světa jazyků LISP a Scheme
    https://www.root.cz/clanky/jemny-uvod-do-rozsahleho-sveta-jazyku-lisp-a-scheme/
  39. The Evolution Of Programming Languages
    https://www.i-programmer.info/news/98-languages/8809-the-evolution-of-programming-languages.html
  40. Evoluce programovacích jazyků
    https://ccrma.stanford.edu/cou­rses/250a-fall-2005/docs/ComputerLanguagesChart.png
  41. Poly/ML Homepage
    https://polyml.org/
  42. PolyConf 16: A brief history of F# / Rachel Reese
    https://www.youtube.com/wat­ch?v=cbDjpi727aY
  43. Programovací jazyk Clojure 18: základní techniky optimalizace aplikací
    https://www.root.cz/clanky/pro­gramovaci-jazyk-clojure-18-zakladni-techniky-optimalizace-aplikaci/
  44. Moscow ML Language Overview
    https://itu.dk/people/ses­toft/mosml/mosmlref.pdf
  45. ForLoops
    http://mlton.org/ForLoops
  46. Funkcionální dobrodružství v JavaScriptu
    https://blog.kolman.cz/2015/12/fun­kcionalni-dobrodruzstvi-v-javascriptu.html
  47. Recenze knihy Functional Thinking (Paradigm over syntax)
    https://www.root.cz/clanky/recenze-knihy-functional-thinking-paradigm-over-syntax/
  48. Currying
    https://sw-samuraj.cz/2011/02/currying/
  49. Používání funkcí v F#
    https://docs.microsoft.com/cs-cz/dotnet/fsharp/tutorials/using-functions
  50. Funkce vyššího řádu
    http://naucte-se.haskell.cz/funkce-vyssiho-radu
  51. Currying (Wikipedia)
    https://en.wikipedia.org/wi­ki/Currying
  52. Currying (Haskell wiki)
    https://wiki.haskell.org/Currying
  53. Haskell Curry
    https://en.wikipedia.org/wi­ki/Haskell_Curry
  54. Moses Schönfinkel
    https://en.wikipedia.org/wi­ki/Moses_Sch%C3%B6nfinkel
  55. .NET framework
    https://dotnet.microsoft.com/en-us/
  56. F# – .NET Blog
    https://devblogs.microsof­t.com/dotnet/category/fshar­p/
  57. Playground: OCaml
    https://ocaml.org/play
  58. The F# Survival Guide
    https://web.archive.org/web/20110715231625/htt­p://www.ctocorner.com/fshar­p/book/default.aspx
  59. Object-Oriented Programming — The Trillion Dollar Disaster
    https://betterprogramming.pub/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7
  60. Goodbye, Object Oriented Programming
    https://cscalfani.medium.com/goodbye-object-oriented-programming-a59cda4c0e53
  61. So You Want to be a Functional Programmer (Part 1)
    https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-1–1f15e387e536
  62. So You Want to be a Functional Programmer (Part 2)
    https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-2–7005682cec4a
  63. So You Want to be a Functional Programmer (Part 3)
    https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-3–1b0fd14eb1a7
  64. So You Want to be a Functional Programmer (Part 4)
    https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-4–18fbe3ea9e49
  65. So You Want to be a Functional Programmer (Part 5)
    https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-5-c70adc9cf56a
  66. So You Want to be a Functional Programmer (Part 6)
    https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-6-db502830403
  67. Don Syme
    https://en.wikipedia.org/wi­ki/Don_Syme
  68. Python to OCaml: Retrospective
    http://roscidus.com/blog/blog/2014/06/0­6/python-to-ocaml-retrospective/
  69. Why does Cambridge teach OCaml as the first programming language?
    https://www.youtube.com/wat­ch?v=6APBx0WsgeQ
  70. OCaml and 7 Things You Need To Know About It In 2021 | Functional Programming | Caml
    https://www.youtube.com/wat­ch?v=s0itOsgcf9Q
  71. OCaml 2021 – 25 years of OCaml
    https://www.youtube.com/watch?v=-u_zKPXj6mw
  72. Introduction | OCaml Programming | Chapter 1 Video 1
    https://www.youtube.com/wat­ch?v=MUcka_SvhLw&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU
  73. Functional Programming – What | OCaml Programming | Chapter 1 Video 2
    https://www.youtube.com/wat­ch?v=JTEwC3HihFc&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=2
  74. Functional Programming – Why Part 1 | OCaml Programming | Chapter 1 Video 3
    https://www.youtube.com/wat­ch?v=SKr3ItChPSI&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=3
  75. Functional Programming – Why Part 2 | OCaml Programming | Chapter 1 Video 4
    https://www.youtube.com/wat­ch?v=eNLm5Xbgmd0&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=4
  76. OCaml | OCaml Programming | Chapter 1 Video 5
    https://www.youtube.com/watch?v=T-DIW1dhYzo&list=PLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU&index=5
  77. Five Aspects of Learning a Programming Language | OCaml Programming | Chapter 2 Video 1
    https://www.youtube.com/wat­ch?v=A5IHFZtRfBs&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=6
  78. Expressions | OCaml Programming | Chapter 2 Video 2
    https://www.youtube.com/watch?v=3fzrFY-2ZQ8&list=PLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU&index=7
  79. If Expressions | OCaml Programming | Chapter 2 Video 3
    https://www.youtube.com/wat­ch?v=XJ6QPtlPD7s&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=8
  80. Let Definitions | OCaml Programming | Chapter 2 Video 4
    https://www.youtube.com/wat­ch?v=eRnG4gwOTlI&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=10
  81. Let Expressions | OCaml Programming | Chapter 2 Video 5
    https://www.youtube.com/wat­ch?v=ug3L97FXC6A&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=10
  82. Variable Expressions and Scope | OCaml Programming | Chapter 2 Video 6
    https://www.youtube.com/wat­ch?v=_TpTC6eo34M&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=11
  83. Scope and the Toplevel | OCaml Programming | Chapter 2 Video 7
    https://www.youtube.com/wat­ch?v=4SqMkUwakEA&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=12
  84. Anonymous Functions | OCaml Programming | Chapter 2 Video 8
    https://www.youtube.com/wat­ch?v=JwoIIrj0bcM&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=13
  85. Lambdas | OCaml Programming | Chapter 2 Video 9
    https://www.youtube.com/wat­ch?v=zHHCD7MOjmw&list=PLre5AT9JnKShBO­PeuiD9b-I4XROIJhkIU&index=15
  86. Operators
    https://ocaml.org/docs/operators
  87. Operator overloading
    https://en.wikipedia.org/wi­ki/Operator_overloading
  88. Generalized algebraic data type
    https://en.wikipedia.org/wi­ki/Generalized_algebraic_da­ta_type
Seriál: F# a OCaml

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.