J'approuve totalement la volonté de vouloir faire connaître ce merveilleux langage qu'est Ocaml, cependant laissez moi poser quelques réserves quant à la pertinence pédagogique de vos exemples, qui sont tirés, si je me souviens bien, d'une discussion à propos des fonctionnalités syntaxiques de c++ (ce qui, convenons-en n'est certainement pas un excellent prémisse ;-) ).
Premièrement il me semble qu'il aurait été judicieux d'aborder la notion de curry-ing et d'application partielle. L'application partielle est ce qui fait que la fonction f : a -> b -> c (le : veut dire "a pour type", _ -> _ "est une fonction de _ vers _" et a,b,c sont des types), lorsqu'elle est appliqué à un l'argument x : a est une fonction qui a le type b -> c. Soit une fonction a n argument lorsqu'elle est appliqué à m < n arguments est une fonction à n-m arguments. NB: l'évaluation de l'expression finale a lieu lorsque l'application est complète.
En ocaml on écrit let f : a -> b -> c = fun a b -> (expr : c) in let f' : b -> c = f (a_expr : a) ou bien sans les annotations de types, qui sont généralement pas nécessaires, let f a b = c_expr in let f' = f a_exp ou a_expr et c_expr sont des expressions de type a ou c. Et ça c'est ce qu'on appelle le currying, c'est à dire de pouvoir associer à une variable une fonction partiellement appliquée. Un exercice pédagogique serait pour un lecteur curieux de copier coller vos exemples de manière partielle afin d'essayer de déduire à priori le type de l'expression résultante.
Deuxièmement, j'en avais déjà fait la remarque précédemment, mais selon moi ce genre de code a peu de sens:
let ecrire (adv:('a,'b,'c) adverbe):('string, 'c) verbe =
fun texte -> adv print_endline texte;;
Dans votre exemple, et contrairement au normes du français que vous tentez de singer, écrire n'est ni un verbe (selon votre définition un verbe est une fonction a un argument), ni un adverbe, mais une fonction qui lorsqu'elle est appliqué à un adverbe et à un verbe donne un autre verbe. Ce qui est, vous en conviendrez je l'espère, un peu déroutant. Votre "écrire" est une sorte de méta-verbe qui se conjugue lui-même pour donner un autre verbe à l'infinitif. Je trouve que pour un document à vocation pédagogique c'est un peu tordu.
Déjà je suggère de substituer vos alias de type adv et verbe afin de retrouver le type "non-obfusqué".
En subsituant adv par sa définition ('a, 'b) verbe -> ('a, 'c) verbe, on obtient
Puis on substitue verbe ('a, 'b) verbe = 'a -> 'b:
ecrire:(('a->b)->('a->'c))->string->'c
On obtient un type qui est inutilement compliqué.
Selon moi votre verbe c'est "écrire", c'est à dire print_endline (string -> unit), votre adverbe c'est "5 fois" qui a comme signature ('a -> unit) -> int -> ('a -> unit) ou encore int -> (a' -> unit) -> ('a -> unit) pour changer l'ordre des paramètres.
# Exemple judicieux ?
Posté par benja . En réponse à la dépêche Apprendre la programmation fonctionnelle avec le MOOC OCaml. Évalué à 4. Dernière modification le 15 septembre 2016 à 22:16.
J'approuve totalement la volonté de vouloir faire connaître ce merveilleux langage qu'est Ocaml, cependant laissez moi poser quelques réserves quant à la pertinence pédagogique de vos exemples, qui sont tirés, si je me souviens bien, d'une discussion à propos des fonctionnalités syntaxiques de c++ (ce qui, convenons-en n'est certainement pas un excellent prémisse ;-) ).
Premièrement il me semble qu'il aurait été judicieux d'aborder la notion de curry-ing et d'application partielle. L'application partielle est ce qui fait que la fonction
f : a -> b -> c(le : veut dire "a pour type", _ -> _ "est une fonction de _ vers _" et a,b,c sont des types), lorsqu'elle est appliqué à un l'argumentx : aest une fonction qui a le typeb -> c. Soit une fonction a n argument lorsqu'elle est appliqué à m < n arguments est une fonction à n-m arguments. NB: l'évaluation de l'expression finale a lieu lorsque l'application est complète.En ocaml on écrit
let f : a -> b -> c = fun a b -> (expr : c) in let f' : b -> c = f (a_expr : a)ou bien sans les annotations de types, qui sont généralement pas nécessaires,let f a b = c_expr in let f' = f a_expou a_expr et c_expr sont des expressions de type a ou c. Et ça c'est ce qu'on appelle le currying, c'est à dire de pouvoir associer à une variable une fonction partiellement appliquée. Un exercice pédagogique serait pour un lecteur curieux de copier coller vos exemples de manière partielle afin d'essayer de déduire à priori le type de l'expression résultante.Deuxièmement, j'en avais déjà fait la remarque précédemment, mais selon moi ce genre de code a peu de sens:
Dans votre exemple, et contrairement au normes du français que vous tentez de singer, écrire n'est ni un verbe (selon votre définition un verbe est une fonction a un argument), ni un adverbe, mais une fonction qui lorsqu'elle est appliqué à un adverbe et à un verbe donne un autre verbe. Ce qui est, vous en conviendrez je l'espère, un peu déroutant. Votre "écrire" est une sorte de méta-verbe qui se conjugue lui-même pour donner un autre verbe à l'infinitif. Je trouve que pour un document à vocation pédagogique c'est un peu tordu.
Déjà je suggère de substituer vos alias de type adv et verbe afin de retrouver le type "non-obfusqué".
En subsituant adv par sa définition
('a, 'b) verbe -> ('a, 'c) verbe, on obtientPuis on substitue verbe
('a, 'b) verbe = 'a -> 'b:On obtient un type qui est inutilement compliqué.
Selon moi votre verbe c'est "écrire", c'est à dire print_endline (string -> unit), votre adverbe c'est "5 fois" qui a comme signature ('a -> unit) -> int -> ('a -> unit) ou encore int -> (a' -> unit) -> ('a -> unit) pour changer l'ordre des paramètres.
Cela tient en 3 lignes...