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 Fabien . É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 foobarbazz . É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.