为什么我的Seq.map中的函数没有被执行?

时间:2017-10-24 14:31:52

标签: f#

我还不明白为什么我的 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

1 个答案:

答案 0 :(得分:7)

Seq<'a>IEnumerable<'a>相同,这是懒惰的。这意味着序列中的每个元素仅在需要时进行评估。如果您想确保调用副作用,那么您可以通过添加Seq.toList将其转换为具体的数据结构,如列表。

然而,编写执行副作用的代码分别对返回值的代码更好,通常是可能的。您可以使用一个函数计算linkIds,并使用Seq.iter执行另一个函数的副作用,这会强制完整评估序列。