Aula 10 OCAML

OCAML online

tutoriais

OCaml F#

outra linguagem funcional mas com componentes de linguagem imperativa

Coisas parecidas

listas

como em Haskell (homogênea) mas separado por ;

let a = [1; 2; 3; 7; 5; 1]

No pattern matching e na construção, o operador que separa head de tail é :: e não : (no Haskell)

let b = 7 :: a

Aplicação de função

Como em Haskell

let f x y = 2*x+y

f 4 3

Funcoes recursivas

precisa usar a palavre rec

let rec gera n =
    if n=0 then []
    else n :: gera (n-1)

Guards (usando o match +when)

let rec pertence x lista =
    match lista with
     |  []               -> false
     |  a::_ when  x = a -> true
     |  _::as            -> pertence x as 

Outras

Coisas diferentes

=

strict (nao Lazy)

Haskell 

f _ = 3

f (1/0) -> 3
OCAML

let f _ = 3

f (1/0) -> erro divisão por 0

tipagem forte

permite modificar (algumas) variáveis

let quit_loop = ref false in
while not !quit_loop do
  print_string "Have you had enough yet? (y/n) ";
  let str = read_line () in
  if str.[0] = 'y' then
    quit_loop := true
done;;

Arrays

Arrays sao vetores modificáveis

let add_vect v1 v2 =
   let len = min (Array.length v1) (Array.length v2) in
   let res = Array.make len 0.0 in
   for i = 0 to len - 1 do
     res.(i) <- v1.(i) +. v2.(i)
   done;
   res;;

Comandos

comando;
comando;
..
comando;
expressão

no lugar de expressões.

Veja de novo

let quit_loop = ref false in
while not !quit_loop do
  print_string "Have you had enough yet? (y/n) "; --> comando
  let str = read_line () in
  if str.[0] = 'y' then                  -> um if sem else!
    quit_loop := true                             -> comando
done;;

me parece que o while é um comando

Outras linguagens funcionais

..