2017-07-06 33 views
8

我學習F#的時刻,但我有一個很難理解這一點:F#收益! (yieldbang)運算符

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

我無法弄清楚什麼yield!操作,即使我讀不準確其他更簡單的例子,似乎yield!返回一個內部序列。

回答

9

產量爆炸算子將被調用序列表達式產生的子序列合併到最終序列中。或者用簡單的話來說:它將返回的序列「平坦化」,以便在最終序列中包含子序列的元素。

對於你的例子:如果沒有屈服爆炸運營商,你會得到類似

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

與產量砰操作你

{ prime1 prime2 prime3 ... } 

其中每個{表示一個新的序列。邊節點:我的第一個示例的實際結果甚至會包含更多的序列,因爲它只會返回僅包含序列的序列,因爲只有在n is prime之間纔會返回素數。