请帮助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
总是返回一个空列表,即使我可以看到列表肯定不是空的?
答案 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()