Reference F#从可变变为参考

Reference F#从可变变为参考,reference,f#,mutable,Reference,F#,Mutable,处理需要可变集合的程序。尝试将集合放入闭包时,我遇到一个错误: let mutable donefiles : Set<FileRecord> = Set.empty let filestodo = Set.difference parms.FileSpecs donefiles let errorFile (file: FileRecord) = donefiles <- Set.add file donefiles 让可变donefiles:Set=Set.emp

处理需要可变集合的程序。尝试将集合放入闭包时,我遇到一个错误:

let mutable donefiles : Set<FileRecord> = Set.empty
let filestodo = Set.difference parms.FileSpecs donefiles
let errorFile (file: FileRecord) =
    donefiles <- Set.add file donefiles
让可变donefiles:Set=Set.empty
让filestodo=Set.difference parms.FileSpecs donefiles
let errorFile(文件:FileRecord)=

donefiles首先,似乎您使用的是F#的旧版本。这是对可变变量的限制

但如果您无法切换到新版本,以下是实际问题的答案:

函数
ref
获取一个值并返回一个可变单元格。此类单元格的类型是
'a ref
,其中
'a
是值的类型

因此,在您的例子中,
ref
函数返回
Set ref
,但您特别注释了
donefiles
,以使type
Set
,因此存在冲突(这是编译器告诉您的)

只需调整类型注释,即可:

let donefiles : Set<FileRecord> ref = ref Set.empty

首先,您使用的似乎是F#的旧版本。这是对可变变量的限制

但如果您无法切换到新版本,以下是实际问题的答案:

函数
ref
获取一个值并返回一个可变单元格。此类单元格的类型是
'a ref
,其中
'a
是值的类型

因此,在您的例子中,
ref
函数返回
Set ref
,但您特别注释了
donefiles
,以使type
Set
,因此存在冲突(这是编译器告诉您的)

只需调整类型注释,即可:

let donefiles : Set<FileRecord> ref = ref Set.empty

您是否可以使用可变的
哈希集
?哈希集似乎没有差异函数。您可以使用
。ExceptWith
哈希集
删除项目集合。您是否可以使用可变的哈希集
,而不是可变的哈希集的可变引用
HashSet
?HashSet似乎没有差异函数。您可以使用
。ExceptWith
HashSet
中删除项目集合。它几乎成功了!通过您的更改(谢谢!),变量声明起作用了,但是闭包定义没有起作用:我得到了错误“值是不可变的”。我尝试了
donefiles
donefiles:=Set.add文件!donefiles
成功了(必须解除var)它几乎成功了!通过您的更改(谢谢!),变量声明起作用了,但是闭包定义没有起作用:我得到了错误“值是不可变的”。我尝试了
donefiles
donefiles:=Set.add文件!donefiles
有效(必须解除var)
donefiles := Set.add file !donefiles