gpt4 book ai didi

f# - Seq.toList 和 List.ofSeq 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 01:25:00 30 4
gpt4 key购买 nike

我正在 fsharpforfunandprofit 网站上阅读 Choosing between collection functions,他展示了一个示例,说明如何避免在处置后访问一次性资源(第 28 节,就在文章末尾)。

他用以下内容模拟了一个数据库...

let dbConnection() =
printfn "Opening connection"
{ new System.IDisposable with
member this.Dispose() =
printfn "Disposing connection"
}

// Read some records from the database
let readCustomersFromDb conn n =
let makeCustomer i =
sprintf "Customer %d" i
seq {
for i = 1 to n do
let customer = makeCustomer i
printfn "Loading %s from the database" customer
yield customer
}

...然后展示了如何通过在返回之前枚举序列来避免该问题......
let readCustomers() =
use conn = dbConnection()
let results = readCustomersFromDb conn 2
results |> List.ofSeq

我对最后一点感到有些困惑,因为我认为我们有一个序列,并想将其转换为列表。这就是它在 C# 中的工作方式,这可能是我思考错误的地方。他似乎在拿一个列表并将其转换为一个序列。

无论如何,我尝试将最后一行更改为...
  results |> Seq.toList

...它的工作原理是一样的。

那么,两者之间有什么区别,为什么他们在这里做同样的事情?我认为序列是非枚举的,在这种情况下,我会期望他的原始代码不起作用。

最佳答案

List.ofSeqSeq.toList 都具有 'a seq -> 'a list 类型,实际上 List.ofSeq 被定义为

let ofSeq source = Seq.toList source

(在 Microsoft.FSharp.Collections.List module 中定义)

所以他们确实是一样的。

当您获得一个列表(与 seq 不同,它是 F# 中的严格结构)时,将对序列的所有元素求值以将列表填充到内存中——这就是您可以使用这两个函数来强制迭代所有值的原因。

关于f# - Seq.toList 和 List.ofSeq 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886987/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com