F#收益! (yieldbang)运营商

时间:2017-07-06 11:33:22

标签: f# yield

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

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

即使我已经阅读了其他更简单的示例,我也无法弄清楚yield!运算符到底做了什么,似乎yield!会返回内部序列。

1 个答案:

答案 0 :(得分:14)

yield bang运算符将被调用序列表达式生成的子序列合并到最终序列中。或者用更简单的词语:它"变平"返回的序列包括最终序列中子序列的元素。

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

这样的东西
{ prime1 { prime2 { prime3 .... }}}

使用yield bang运算符

{ prime1 prime2 prime3 ... }

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