D'ailleurs, je préfère la version verbeuse, je la trouve plus lisible ;)
C'est parce que la pipeline est courte. Il faut voir cette notation pointée de Rust comme le pipe | du shell : reader.next() | unwrap_or | map_err | map. Sur de longues pipelines, c'est plus simple à écrire et il vaut mieux laisser le compilateur inliner le tout plutôt que de le faire à la main (comme dans sa version verbeuse, qui contient d'ailleurs une erreur : le cas None doit retourner Ok(false) de type Result<Bool, String>).
En OCaml (j'étais bien obligé), on écrirait un code du genre :
Les patterns à base de map sont omniprésents dans le paradigme fonctionnel. Un type paramétrique à un paramètre (comme les options, les listes, les tableaux, les vecteurs...) est une fonction des types dans les types. Ainsi si j'ai une fonction qui transforme les objets du paramètre (disons des int en string), je peux la lifter pour opérer sur le type paramétrique (un peu comme une composition de fonction, si tu veux). Exemples :
(* un int optionnel devient un string optionnel *)Option.mapstring_of_int(Some1);;-:stringoption=Someu"1"(* une liste de ints devients une liste de strings *)List.mapstring_of_int[1;2;3];;-:stringlist=[u"1";u"2";u"3"](* un tableau de ints devient un tableau de strings *)Array.mapstring_of_int[|1;2;3|];;-:stringarray=[|u"1";u"2";u"3"|]
Le type Result est lui un type paramétrique à deux paramètres : on peut donc faire un map soit sur le type en paramètre de Ok, soit sur celui en paramètre de Err. Ce qui soit donne deux fonctions map (comme en Rust), soit une fonction map_both comme dans mon exemple en OCaml (ou bimap en Haskell) qui prend deux fonctions en paramètres (une pour chaque type).
(* la double map pour le type result *)letbimapfg=functionOkx->Ok(fx)|Errore->Error(ge)(* le unwrap_or comme en Rust *)letunwrap_ord=functionNone->d|Somex->x(* la pipeline comme en Rust *)letpipelinex=x|>unwrap_or(Ok"q")|>bimap(funs->s<>"q")(Printf.sprintf"Houla y'a eu un truc: %s")(* exemples de sortie *)pipelineNone;;-:(bool,string)result=Okfalsepipeline(Some(Ok"f"));;-:(bool,string)result=Oktruepipeline(Some(Error"une erreur"));;-:(bool,string)result=Erroru"Houla y'a eu un truc: une erreur"
P.S : sinon sympa le journal, et comme depuis les derniers journaux sur la virgule flottante j'ai installé GNAT et GNAT Programming Studio je vais pouvoir regarder un code ADA idiomatique et jouer avec :-) (ravi de voir au passage qu'il y a des développeurs ADA qui comprennent l'encapsulation ;-).
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.
[^] # Re: Merci !
Posté par kantien . En réponse au journal Portage de TapTempo en Ada. Évalué à 5. Dernière modification le 28 février 2018 à 18:41.
C'est parce que la pipeline est courte. Il faut voir cette notation pointée de Rust comme le pipe
|du shell :reader.next() | unwrap_or | map_err | map. Sur de longues pipelines, c'est plus simple à écrire et il vaut mieux laisser le compilateur inliner le tout plutôt que de le faire à la main (comme dans sa version verbeuse, qui contient d'ailleurs une erreur : le casNonedoit retournerOk(false)de typeResult<Bool, String>).En OCaml (j'étais bien obligé), on écrirait un code du genre :
Les patterns à base de
mapsont omniprésents dans le paradigme fonctionnel. Un type paramétrique à un paramètre (comme les options, les listes, les tableaux, les vecteurs...) est une fonction des types dans les types. Ainsi si j'ai une fonction qui transforme les objets du paramètre (disons desintenstring), je peux la lifter pour opérer sur le type paramétrique (un peu comme une composition de fonction, si tu veux). Exemples :Le type
Resultest lui un type paramétrique à deux paramètres : on peut donc faire unmapsoit sur le type en paramètre deOk, soit sur celui en paramètre deErr. Ce qui soit donne deux fonctionsmap(comme en Rust), soit une fonctionmap_bothcomme dans mon exemple en OCaml (oubimapen Haskell) qui prend deux fonctions en paramètres (une pour chaque type).P.S : sinon sympa le journal, et comme depuis les derniers journaux sur la virgule flottante j'ai installé GNAT et GNAT Programming Studio je vais pouvoir regarder un code ADA idiomatique et jouer avec :-) (ravi de voir au passage qu'il y a des développeurs ADA qui comprennent l'encapsulation ;-).
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.