请帮助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总是返回一个空列表,即使我可以看到列表肯定不是空的?
因为lst是价值,而不是功能.
在F#中,值和函数之间的技术差异在于函数具有参数,而值不具有参数.
当你声明时lst,你没有给它任何参数,所以编译器将其理解为" 我想accounts在这个特定时间点取值,并lst从现在开始引用该值 ".因此,每次编写时lst,您都不会调用函数,而只是引用同样的空列表,即accounts初始化时的值.
要创建lst一个真正的函数,您需要为它提供一个参数.并且因为它并不真正需要任何实际数据,所以赋予它的自然参数是unit值 - ().
let lst () = accounts
Run Code Online (Sandbox Code Playgroud)
PS这整个诡计最终来自变异状态.尽可能避免使用它.
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |