Parcours
/
Unison
Unison
/
Exercices
/
Opérations sur les flux
Opérations sur les flux

Opérations sur les flux

Moyen

Instructions

Implémente les opérations de base de la capacité Stream.

Dans les langages fonctionnels, les fonctions comme filter, map et reduce sont très courantes. Implémente une série de combinateurs fonctionnels de base pour une capacité de flux, sans utiliser de fonctions existantes. Pour cela, tu devras écrire tes propres gestionnaires de capacités.

💡 On va appeler cette capacité MyStream pour éviter les conflits avec la capacité Stream qui existe déjà dans la bibliothèque standard.

Les opérations que tu devras implémenter sont :

  • MyStream.fromList (à partir d'un tableau d'éléments, crée un flux d'éléments )
  • MyStream.toList (à partir d'un flux d'éléments, le matérialise en un tableau)
  • MyStream.toListWithResult (à partir d'un flux d'éléments, le matérialise en un tableau accompagné du résultat de la fonction de flux)
  • MyStream.ignore (à partir d'un flux d'éléments, ignore les valeurs émises et renvoie le résultat de la fonction de flux)
  • MyStream.filter (à partir d'un prédicat et d'un MyStream, renvoie le MyStream de tous les éléments pour lesquels predicate(item) est vrai) ;
  • MyStream.map (à partir d'une fonction et d'un MyStream, renvoie le MyStream des résultats de l'application de function(item) à tous les éléments) ;
  • MyStream.flatMap (à partir d'une fonction qui produit un MyStream et d'un MyStream, renvoie le MyStream des résultats de l'application de function(item) à tous les éléments)

À propos de l'ability Stream

Stream est une ability d'Unison qui sert à émettre des valeurs.

On peut utiliser l'ability Stream quand une fonction doit produire des valeurs comme effet secondaire pendant son exécution. Par exemple, cette fonction renvoie la dernière valeur de la liste, mais émet un total cumulé au fur et à mesure que chaque élément est parcouru :

emitRunningTotal : '{Stream Nat} Nat
emitRunningTotal = 'let
  use Nat +
  List.foldLeft (
    acc a -> let
      runningTotal = acc + a
      Stream.emit runningTotal
      a
    ) 0 [1,2,3,4,5]

On peut matérialiser le Stream sous forme de List en même temps que la valeur de retour de la fonction qui le produit, à l'aide d'un gestionnaire d'ability :

> Stream.toListWithResult! emitRunningTotal
  ⧩
  ([1, 3, 5, 7, 9], 5)
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Unison Exercism

Prêt à commencer Opérations sur les flux ?

Inscris-toi sur Exercism pour apprendre et maîtriser Unison avec 53 exercices, et un vrai mentorat humain, le tout gratuitement.