2017-05-01 3 views
1

Ich habe eine Sequenz in F #:Replizieren Listenelemente n-mal in einer F # Sequenz

let n = 2 

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

Ich mag jedes Element in der Reihenfolge n-mal drucken. Ich kann es auf diese Weise tun:

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

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

Ausgabe dieser ist:
ein
ein
b
b
c
c

Ich denke, das nicht die beste Lösung ist. Wie replizieren Sie die Elemente in der Sequenz?

Antwort

5

Sie eine Funktion erstellen kann jedes Element einer Eingangssequenz zu replizieren:

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

dann

seq1 |> replicateAll 2 |> Seq.iter (printfn "%s") 
4

Es gibt tatsächlich eine Wiederholungsfunktion:

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] 

Und Sie können Tue Funktionszusammensetzung darauf, die den Lambda loswerden wird:

let repCol n xs = (List.replicate >> List.collect) n xs 
+0

Funktioniert es auch für Sequenzen? –

+0

auf F # 4.x, ja. – s952163

3

Ich würde lieber mit einer Sequenz Berechnung Ausdruck gehen.
Sieht sauberer aus:

let replicateAll n xs = seq { 
    for x in xs do 
    for _ in 1..n do 
     yield x 
} 
+0

schön danke! –

Verwandte Themen