(Mis)了解Seq.cache

Tea*_*Dev 6 f# sequence

我有以下代码(在一个更大的函数内,但这不重要):

let ordersForTask = Dictionary<_, _>()

let getOrdersForTask task =
    match ordersForTask.TryGetValue task with
    | true, orders -> orders
    | false, _ ->
        let orders =
            scenario.Orders
            |> Seq.filter (fun (order : Order) -> order.Tasks.Contains(task))
            |> Seq.cache

        ordersForTask.Add(task, orders)
        orders
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这应该导致order.Tasks.Contains()为每对ordertask值调用一次,无论多久getOrdersForTask调用相同的task值,因为输入序列只迭代(最多)一次.但是,情况似乎并非如此; 如果我n为所有的值调用函数时间task,则分析显示n * number of orders * number of tasks调用Contains().

更换Seq.cacheSeq.toList了我的预期效果,但我想避免招致的成本Seq.toList.

Seq.cache在使用它时误解或做错了什么?