Forum Programmation.autre Rust, Haskell, composition, monad et arrow

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
30
sept.
2019

Salutation à vous,

Tout est dans le titre, en vrac…

Voilà, depuis des années je ne code sérieusement qu'en Haskell, et j'ai envie de voir du pays, pourquoi pas rust ? Je me suis lancé dans un petit projet à base de opencv, et j'ai la tête remplie d'idiomes Haskell. Typiquement, pour appliquer une série de traitement à une image de manière séquentielle, en Haskell on fait :

algorithme = preprocessing >>=
             traitement1 >>=
             traitement2 >>=
             \i -> traitement3 i >>= {- soyons fous -}
                   traitement i) ...

Ou bien un code équivalent en style arrow

En rust, je me retrouve à faire un truc du style :

img1 = preprocessing(input)?;
img2 = traitement1(img1)?;
i = traitement2(img2)?;
img3 = traitement3(i)?;
img4 = traitement4(i,img3)?;

ou bien, plus conneries-proof mais tout aussi moche :

traitement4(traitement3(traitement2(traitement1(input)?)?)?)?… etc.

Comment on fait ça joliment ?

  • # Quelques idées

    Posté par  (site web personnel) . Évalué à 2.

    Regarde du côté de Result

    Ca peut donner quelque chose du genre

    let img = preprocessing(input) // prepocessing: fn(input) -> img1
    .and_then(traitement1) // traitement1: fn(img1) -> img2
    .and_then(traitement2) // traitement2: fn(img2) -> i
    .and_then(traitement3) // traitement3: fn(i) -> (i, img3)
    .and_then(traitement4)?; // traitement4: fn((i, img3) -> img4

    Si tu es aventureux, tu peux regarder sur crates.io s'il n'y a pas des crates fournissant ces monades.

    Et en règle générale, il n'est pas recommandé d'écrire du Rust en pensant aux idiomes d'un autre langage.

    • [^] # Re: Quelques idées

      Posté par  . Évalué à 2.

      Ah mais oui, bien sûr…

      Comme un con je fouillais la doc à la recherche de "bind" de "monad" de "combinator" etc.
      J'ai même pas pensé que ces fonctions pouvaient être implémentés sans que leurs noms soient mentionnées dans la doc, ou sans que la structure algébrique soit explicite avec un trait.

      and_then = bind
      ok = return

      C'est bon, j'ai retrouvé mes petits :-)

      Merci beaucoup !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.