outra linguagem funcional mas com componentes de linguagem imperativa
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
Como em Haskell
let f x y = 2*x+y
f 4 3
precisa usar a palavre rec
let rec gera n =
if n=0 then []
else n :: gera (n-1)
let rec pertence x lista =
match lista with
| [] -> false
| a::_ when x = a -> true
| _::as -> pertence x as
let ... in
para definir funções e variáveis locais
List.map
e List.fold_left
em vez de map
e foldl
=
que é tambem o operador para “definição de função” (super confuso) (veja o código do pretence acima_Haskell
f _ = 3
f (1/0) -> 3
OCAML
let f _ = 3
f (1/0) -> erro divisão por 0
não converte de int para float automaticamente
tem operações diferentes para int
e float
: +
para int, +.
para float
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;;
quit_loop
é um “apontador” (ref
) para bool
!quit_loop
é o valor de quit_loop
:=
é atribuição
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;;
note a operação <-
(e nao o :=
)
note tambem o for
que é apenas para gerar números.
nao existe o break
para sair de um loop
Existe um tipo unit
ou ()
que é um comando (que não retorna nada - o importante é seu efeito colateral)
voce pode usar o padrão
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
lambda, map, Reduce em Python.
Lisp e derivados (Scheme, Clojure)
Elm para browser (gera javascript)
..