J'ai une séquence en F #:

let n = 2

let seq1 = {
    yield "a"
    yield "b"
    yield "c"
}

Je veux imprimer chaque élément de la séquence n fois. Je peux le faire de cette façon:

let printx line t = 
    for i = 1 to t do
        printfn "%s" line

seq1 |> Seq.iter (fun i -> printx i n)

Le résultat de ceci est:
un
un
b
b
c
c

Je pense que ce n’est pas la meilleure solution. Comment répliquer les éléments de la séquence?

1
Dávid Molnár 1 mai 2017 à 16:26

3 réponses

Meilleure réponse

Vous pouvez créer une fonction pour répliquer chaque élément d'une séquence d'entrée:

let replicateAll n s = s |> Seq.collect (fun e -> Seq.init n (fun _ -> e))

Ensuite

seq1 |> replicateAll 2 |> Seq.iter (printfn "%s")
5
Lee 1 mai 2017 à 13:34

Il existe en fait une fonction de réplication:

let xs = [1; 2; 3; 4; 5]
xs |> List.collect (fun x -> List.replicate 3 x)
//val it : int list = [1; 1; 1; 2; 2; 2; 3; 3; 3; 4; 4; 4; 5; 5; 5]

Et vous pouvez faire de la composition de fonctions dessus, ce qui éliminera le lambda:

let repCol n xs = (List.replicate >> List.collect) n xs
3
s952163 2 mai 2017 à 00:25

Je préférerais utiliser une expression de calcul de séquence.
Semble plus propre:

let replicateAll n xs = seq {
  for x in xs do
    for _ in 1..n do
      yield x
}
3
Fyodor Soikin 1 mai 2017 à 17:50