2017-07-06 8 views
8

Ich lerne F # im Moment, aber ich habe eine harte Zeit mit diesem Verständnis:F # Ausbeute! (Yieldbang) Betreiber

let allPrimes = 
let rec allPrimes' n = 
    seq { 
     if isPrime n then 
      yield n 
     yield! allPrimes' (n + 1) } 
allPrimes' 2 

Ich bin nicht in der Lage, herauszufinden, was der yield! Operator genau funktioniert, obwohl ich gelesen habe andere einfachere Beispiele und es scheint yield! gibt eine innere Sequenz zurück.

Antwort

9

Der Yield-Bang-Operator führt die von den aufgerufenen Sequenzausdrücken erzeugte Subsequenz in die endgültige Sequenz zusammen. Oder einfacher gesagt: es "flacht" die zurückgegebene Sequenz so ab, dass sie die Elemente der Untersequenz in der endgültigen Sequenz enthält.

Für Ihr Beispiel: Ohne den Ertrag Knall Operator Sie so etwas wie

{ prime1 { prime2 { prime3 .... }}} 

mit dem Ertrag Knall Operator bekommen würde bekommen Sie

{ prime1 prime2 prime3 ... } 

wo jeder { eine neue Sequenz bezeichnet. Seitenknoten: Das tatsächliche Ergebnis aus meinem ersten Beispiel würde sogar mehr Sequenzen enthalten, da es Sequenzen zurückgeben würde, die nur Sequenzen enthalten, da die Primzahl nur zurückgegeben wird, wenn n is prime.