3 votes

Pipeline de fonctions scala

Est-il possible de créer un pipeline de fonctions en scala ? Je voulais faire quelque chose comme la syntaxe suivante en F#, obtenue grâce à l'opérateur |>.

indexPairs |> Seq.iter (fun (i,j) -> parents.[j] <- Some nodes.[i])

Je sais que cela peut être facilement fait avec une compréhension de liste, mais l'idée est de faire des choses plus complexes comme

indexPairs |> Seq.groupBy fst |> Seq.iter (fun (i, pairs) -> sons.[i] <- pairs |> Seq.map (fun (_,j) -> nodes.[j]) |> Seq.toList)

ce qui, à mon avis, contribue à une meilleure lisibilité du code.

3voto

Alexander Ershov Points 268

Vous pouvez utiliser soit compose ou andThen .

val fComposeG = f _ compose g _ // fComposeG(x) equals f(g(x))
val fAndThenG = f _ andThen g _ // fAndThenG(x) equals g(f(x))

3voto

P. Frolov Points 691

Lors de l'utilisation de Scalaz comme suggéré dans une autre réponse, c'est parfaitement raisonnable, vous pouvez ajouter une simple classe de valeur pour le même objectif si vous voulez éviter d'ajouter une dépendance à une bibliothèque externe :

implicit class ChainOps[A](val value: A) extends AnyVal {
  def |>[B](f: A => B): B = f(value)
}

def add(other: Int)(x: Int): Int = x + other
def mul(other: Int)(x: Int): Int = x * other
val value = 12
value |> add(9) |> mul(2) // 42

2voto

Dr. Vick Points 112

Vous pouvez utiliser l'opérateur pipe de Scalaz dans une syntaxe comme celle-ci :

import scalaz.Scalaz._

def f1(a:String):String =a + "1"
def f2(a:String):String =a + "2"
def f3(a:String):String =a + "3"
val text:String = "abc to xyz"
f1(text) |> f3 |> f2

scala> res2: String = abc to xyz132

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X