我还不明白为什么我的 addLink 函数没有被调用。
我有以下代码:
let links = source |> getLinks
let linkIds = links |> Seq.map addLink // addLink never gets executed
起初,我认为 links 值为空。
然而,事实并非如此。我通过调用以下内容验证了它的填充:
let count = Seq.length links // Returns over 100 items
注意:
我能够执行该功能的唯一方法是首先执行:
let count = linkIds |> Seq.length // Call this after performing map
为什么我需要这样做才能调用我的函数?
附录
let addLink (info:Link) =
let commandFunc (command: SqlCommand) =
command |> addWithValue "@ProfileId" info.ProfileId
|> addWithValue "@Title" info.Title
|> addWithValue "@Description" info.Description
|> addWithValue "@Url" info.Url
|> addWithValue "@ContentTypeId" (info.ContentType |> contentTypeToId)
|> addWithValue "@IsFeatured" info.IsFeatured
|> addWithValue "@Created" DateTime.Now
commandFunc |> execute connectionString addLinkSql
[<CLIMutable>]
type Link = {
Id: int
ProfileId: string
Title: String
Description: String
Url: string
Topics: Topic list
ContentType: string
IsFeatured: bool
}
这是source code。
答案 0 :(得分:7)
Seq<'a>
与IEnumerable<'a>
相同,这是懒惰的。这意味着序列中的每个元素仅在需要时进行评估。如果您想确保调用副作用,那么您可以通过添加Seq.toList
将其转换为具体的数据结构,如列表。
然而,编写执行副作用的代码分别对返回值的代码更好,通常是可能的。您可以使用一个函数计算linkIds,并使用Seq.iter
执行另一个函数的副作用,这会强制完整评估序列。