2017-07-06 61 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之间才会返回素数。