Définissez une fonction einstein u v
qui prend en argument deux vitesses et qui calcule leur somme avec la loi d'addition des vitesses en relativité restreinte.
où la vitesse de la lumière $c= 300000 km.s^{-1}$ est une constante que vous définirez en dehors de votre fonction.
Le type de la fonction doit être float -> float -> float
, et non float * float -> float
. Autrement dit, on attend une fonction "curryfiée", dans le style OCaml habituel.
Définissez de quatre façons différentes la fonction flatten : 'a list list -> 'a list
telle que flatten [l1; ... ln]
renvoie la concaténation l1@...@ln
. Par exemple, flatten [[1;2];[];[3]]
renvoie [1;2;3]
.
List.fold_left
Un nombre entier $n\geq 1$ est dit quadratfrei s'il n'existe pas de nombre premier $p$ tel que $p^2$ divise $n$. Par exemple
Définissez une fonction est_quadratfrei : int -> bool
qui permet de tester si un entier $n\geq 1$ est quadratfrei.
On veut définir un type complexe
qui permet de représenter un nombre complexe soit "en scalaire", avec sa partie réelle et sa partie imaginaire, soit "en polaire", avec son module et son argument. On introduit les types de données suivants.
type scalaire = {re:float; im:float}
type polaire = {mo:float; arg:float}
type complexe =
| Scalaire of scalaire
| Polaire of polaire
Définissez la fonction module_p : polaire -> float
qui calcule le module d'un enregistrement de type polaire
, autrement dit le contenu du champs mo
.
Définissez la fonction module_s : scalaire -> float
qui calcule le module d'un enregistrement de type scalaire
. On rappelle que si $x$ et $y$ sont les parties réelle et imaginaire d'un nombre complexe, alors son module est égal à $\sqrt{x^2+y^2}$.
Définissez la fonction module_c : complexe -> float
qui calcule le module d'un nombre complexe, représenté soit par ses coordonnées scalaires, soit par ses coordonnées polaires.
On rappelle le type des arbres binaires d'expressions vu en cours
type arbre =
| Feuille of feuille
| Noeud of operateur * arbre * arbre
and feuille =
| Const of int
| Var of string
and operateur = PLUS | SUB | MULT | DIV
Définissez la fonction nb_feuilles : arbre -> int
qui calcule le nombre de feuilles d'un arbre.
Définissez la fonction sans_div : arbre -> bool
qui renvoie true
si l'opérateur DIV
n'apparait pas dans l'arbre.
Ecrivez une fonction wc : string -> int
. L'entier wc nom_fichier
renvoyé par la fonction est le nombre de lignes du fichier nom_fichier
.
Pourquoi wc? : le nom de la fonction est tiré de l'utilitaire shell wc
(word count) qui fait la même chose avec l'option -l
(souvenir de L1?).
sqrt 2. +. 3. ** 2. /. 3.
type id = {nom: string; age: int}
let age id = id.age
List.hd [1;2;3]
List.tl [1;2;3]
[1;2] @ [3;4]
1::[2;3]
List.fold_left (++) x0 [x1;...;xn]
renvoie (...(x0++x1)++...)++xn
.
List.fold_left (^) "" ["hello"; " "; "world"; "!"]
let rec my_fold_left f x0 l = match l with
| [] -> x0
| x1::x2xn -> my_fold_left f (f x0 x1) x2xn
let r = ref 0
while !r <> 10 do r := !r + 1; print_int !r done
let premiere_ligne fichier =
try
let ic = open_in fichier in
let res = input_line ic in
close_in ic;
res
with End_of_file -> invalid_arg "fichier vide!"