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 fonction even_nums dont l'entrée est un entier n (supposé positif) et dont le résultat est une liste qui contient toutes les paires de nombres a pour lesquelles 0 < a <= n est valable et a 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 entier n (supposé positif) et renvoie une liste de paires (a,b) telles que 0 < a <= n, 0 < b <= n et a+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 entier n (supposé positif) et renvoie un triplet de paires (a,b,c) telles que 0 < a <= n, 0 < b <= n, 0 < c <= n et a^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 fonction palindromes qui prend en entrée un entier n (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 fonction parse_char qui prend en entrée un caractère c et une chaîne s, et si s commence par c, renvoie une valeur monadique contenant le reste de la chaîne s (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 :

    expr := term 
    term := factor | factor op expr 
    op := '+' | '-'
    factor := digit | '(' expr ')'
    digit := '0' | '1' 
    
    Plus précisément, si une chaîne donnée s est conforme à la grammaire ci-dessus, alors expr s doit résulter en Some "", 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 renvoie Some pp 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"


Site built with MkDocs and a slightly-modified version of Terminal for MkDocs.
Last update: September 2023