为什么 F# 懒惰地评估这个并且两次低于?

Why is F# evaluating this lazily and twice below?

我期待下面第一行中的 quotes 在 F# 中得到热切的评估。它被懒惰地评估了两次。为什么?

let quotes = getFundsClosingPrice dbFunds // httpGet the closing prices
quotes
|> fun quotes ->
    let maxDate =
        quotes // <- quotes evaluated 1st time
        |> Seq.maxBy (
            fun (quote) -> 
                quote.TradedOn)
        |> fun q -> 
            q.TradedOn
    quotes
    |> Seq.map 
        (fun (quote) -> // <- quotes evaluated 2nd time. Why??
            { 
                Symbol = quote.Symbol; 
                ClosingPrice = quote.ClosingPrice; 
                TradedOn = maxDate
            }
        )

如何才能热切评价?

Seq 是 IEnumerable,具有大量方便的函数。每个映射函数(和相关函数)从头开始评估序列。

可以在开头将序列转成列表或数组:

let quotes = getFundsClosingPrice dbFunds |> List.ofSeq

或者您可以使用 Seq.cache