F#收益!(yieldbang)运营商

sch*_*gab 13 f# yield

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

let allPrimes =
let rec allPrimes' n = 
    seq {
        if isPrime n then
            yield n
        yield! allPrimes' (n + 1) }
allPrimes' 2
Run Code Online (Sandbox Code Playgroud)

yield!即使我读过其他更简单的例子,我也无法弄清楚算子究竟做了什么,它似乎yield!返回了一个内部序列.

Mat*_*ten 15

yield bang运算符将被调用序列表达式产生的子序列合并到最终序列中.或者用更简单的词语:它"平坦化"返回的序列,以在最终序列中包含子序列的元素.

对于你的例子:如果没有yield bang运算符,你会得到类似的东西

{ prime1 { prime2 { prime3 .... }}}
Run Code Online (Sandbox Code Playgroud)

你得到的收益率操作员

{ prime1 prime2 prime3 ... }
Run Code Online (Sandbox Code Playgroud)

其中每个{表示一个新序列.侧节点:我的第一个例子的实际结果甚至会包含更多序列,因为它会返回仅包含序列的序列,因为仅在返回时才返回素数n is prime.