当我尝试从此模块返回可变列表的内容时,为什么总是得到一个空列表?

时间:2016-08-16 16:10:52

标签: f#

请帮助F#初学者理解这一点!我有以下F#代码(我刚刚创建它以帮助我学习,所以我意识到它可能很糟糕):

type Account = {
    ID: Guid
    Name: string
};

module Accounts =
    let mutable accounts:Account list = []

    // Why does this always return empty?
    let lst =
        accounts

    let load id =
        accounts |> List.find(fun a-> a.ID = id)

    let save account =
        accounts <- account::accounts

Accounts.save { ID = Guid.NewGuid(); Name = "Account One"}

let id = Guid.NewGuid()

Accounts.save { ID = id; Name = "Account Two"}

let account = Accounts.load id

如果我在此阶段写出account的值(在上面的代码之后),我会看到我期望的Account记录(帐户二),如果我转储Accounts.accounts ,我可以看到可变列表包含Account个记录。

那么为什么Account.lst总是返回一个空列表,即使我可以看到列表肯定不是空的?

2 个答案:

答案 0 :(得分:7)

因为lst是值,而不是函数。

在F#中,值和函数之间的技术差异在于函数具有参数,而值不具有。

当您声明lst时,您没有给它任何参数,因此编译器将其理解为&#34; 我想在此处获取accounts的值特定时间点,从现在开始将该值称为lst &#34;。因此,每次编写lst时,您都不会调用函数,而只是在初始化时引用与accounts的值相同的空列表。

要使lst成为真正的函数,您需要为其指定一个参数。因为它并不真正需要任何实际数据,所以提供它的自然参数是unit值 - ()

let lst () = accounts

P.S。整个诡计最终来自变异状态。尽可能避免使用它。

答案 1 :(得分:4)

因为lst是一个值而不是一个函数。您需要将其转换为函数:

let lst () =
    accounts

然后您可以通过以下方式调用它:

Accounts.lst()