F# 屈服! (yieldbang) 操作员

F# yield! (yieldbang) operator

我目前正在学习 F#,但我很难理解这一点:

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

我无法弄清楚 yield! 运算符到底做了什么,即使我已经阅读了其他更简单的示例并且看起来 yield! returns 是一个内部序列。

yield bang 运算符将调用的序列表达式产生的子序列合并到最终序列中。或者用更简单的话来说:它 "flattens" returned 序列以在最终序列中包含子序列的元素。

对于您的示例:如果没有 yield bang 运算符,您会得到类似

的结果
{ prime1 { prime2 { prime3 .... }}}

使用 yield bang 运算符你得到

{ prime1 prime2 prime3 ... }

其中每个 { 表示一个新序列。侧节点:我的第一个示例的实际结果甚至会包含更多序列,因为它将 return 序列仅包含序列,因为如果 n is prime.[=14= 则素数仅 returned ]