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

Mar*_*ell 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

Fyo*_*kin 7

因为lst是价值,而不是功能.

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

当你声明时lst,你没有给它任何参数,所以编译器将其理解为" 我想accounts在这个特定时间点取值,并lst从现在开始引用该值 ".因此,每次编写时lst,您都不会调用函数,而只是引用同样的空列表,即accounts初始化时的值.

要创建lst一个真正的函数,您需要为它提供一个参数.并且因为它并不真正需要任何实际数据,所以赋予它的自然参数是unit值 - ().

let lst () = accounts
Run Code Online (Sandbox Code Playgroud)

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