2017-01-18 6 views
2

Wie kann ich einen unendlichen Sequenzgenerator implementieren, den ich mit den Bibliotheksfunktionen Stream bearbeiten kann?In Elixir unendliche Sequenz generieren

Ich möchte damit die ersten n Primzahlen erzeugen. Ich arbeite rekursiv, aber ich mag Aufzählungen und Pipes viel besser.

Ich habe dies in Python mit einem Generator getan gesehen:

def number_generator(): 
    n = 3 
    while True: 
    yield n 
    n += 2 

Gibt es eine eingebaute Funktion solche Sequenzen in Elixir, oder eine einfache DIY Alternative zu generieren? Hat dieses Muster einen Namen in Elixir?

Antwort

4

Sie haben mindestens zwei Möglichkeiten einen Strom in Elixir zu erzeugen. Die allgemeinste ist Stream.unfold

Stream.unfold(3, fn(x) -> {x, x + 2} end) 

# or 

Stream.unfold(3, &({&1, &1 + 2})) 

aber in Ihrem Fall können Sie die einfachere Stream.iterate

Stream.iterate(3, fn(x) -> x + 2 end) 

# or 

Stream.iterate(3, &(&1 + 2)) 
+0

Ehrfürchtig verwenden! Genau das, was ich brauchte. –

2

Stream.iterate/2 kommt zur Rettung:

generator = Stream.iterate(3, &(&1+2)) 
#⇒ #Function<61.8243704/2 in Stream.unfold/2> 
generator |> Enum.take(5) 
#⇒ [3, 5, 7, 9, 11]