Exercise 0 - Monade de listes
-
Problème 0: En utilisant la monade
ListMonad
, écrivez une fonction qui triple tous les éléments d'une liste. Par exemple :# [1;2;3;4] >>= triple;; - : int list = [1; 1; 1; 2; 2; 2; 3; 3; 3; 4; 4; 4]
-
Problème 1 : En utilisant la monade
ListMonadPlus
, implementez une fonctioneven_nums
dont l'entrée est un entiern
(supposé positif) et dont le résultat est une liste qui contient toutes les paires de nombresa
pour lesquelles0 < a <= n
est valable eta
est pair. Par exemple :# even_nums 10;; - : int list = [0; 2; 4; 6; 8]
Hint
Utilisez la fonction guard !
- Problème 2 : Implementez une fonction
sum_is_odd
qui prend en entrée un entiern
(supposé positif) et renvoie une liste de paires(a,b)
telles que0 < a <= n, 0 < b <= n
eta+b
est impair. Par exemple :# sum_is_odd 4;; - : (int * int) list = [(0, 1); (0, 3); (1, 0); (1, 2); (2, 1); (2, 3); (3, 0); (3, 2)
Hint
Comme ci-dessus !
-
Problème 3 : Implementez une fonction
pythagorean_triplets
qui prend en entrée un entiern
(supposé positif) et renvoie un triplet de paires(a,b,c)
telles que0 < a <= n, 0 < b <= n, 0 < c <= n
eta^2+b^2=c^2
. Par exemple:# pythagorean_triplets 10;; - : (int * int * int) list = [(3, 4, 5); (4, 3, 5); (6, 8, 10); (8, 6, 10)]
-
Problème 3 : En utilisant la monade
ListMonadPlus
, implementez une fonctionpalindromes
qui prend en entrée un entiern
(supposé être positif) et renvoie une liste de toutes les chaînes palindromes composées des caractères'0', '1'
de taille inférieure ou égale àn
. Par exemple:# check_1 5;; - : string list = ["00000"; "00100"; "01010"; "01110"; "10001"; "10101"; "11011"; "11111"] # check_1 6;; - : string list = ["000000"; "001100"; "010010"; "011110"; "100001"; "101101"; "110011"; "111111"]
Exercise 1: Parsing with the MaybeMonadPlus
-
Problème 0: En utilisant la monade
MaybeMonadPlus
, implementez une fonctionparse_char
qui prend en entrée un caractèrec
et une chaînes
, et sis
commence parc
, renvoie une valeur monadique contenant le reste de la chaînes
(avec le premier caractère supprimé), sinon elle renvoie une valeur monadique signifiant un échec. Par exemple :# parse_char '0' "0101";; - : string option = Some "101" # parse_char '0' "1010";; - : string option = None
-
Problème 1: Utilisez la fonction ci-dessus pour implémenter une fonction
expr
qui analyse les expressions de la grammaire suivante :Plus précisément, si une chaîne donnéeexpr := term term := factor | factor op expr op := '+' | '-' factor := digit | '(' expr ')' digit := '0' | '1'
s
est conforme à la grammaire ci-dessus, alorsexpr s
doit résulter enSome ""
, c'est-à-dire qu'il doit consommer tous les caractères de la chaîne. Si ce n'est pas le cas, elle consomme partiellement la chaîne et renvoieSome p
oùp
est une chaîne non vide de caractères, ou bien elle renvoie None .
Par exemple :
# expr "0";;
- : string option = Some ""
utop # expr "1+0";;
- : string option = Some ""
# expr "(1+0)-1";;
- : string option = Some ""
# expr "(1+1)-1+(1+(1+0-1+0))";;
- : string option = Some ""
# expr "2";;
- : string option = None
utop # expr "1+2";;
- : string option = Some "+2"