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
,以使typeSet
,因此存在冲突(这是编译器告诉您的)
只需调整类型注释,即可:
let donefiles : Set<FileRecord> ref = ref Set.empty
首先,您使用的似乎是F#的旧版本。这是对可变变量的限制
但如果您无法切换到新版本,以下是实际问题的答案:
函数ref
获取一个值并返回一个可变单元格。此类单元格的类型是'a ref
,其中'a
是值的类型
因此,在您的例子中,ref
函数返回Set ref
,但您特别注释了donefiles
,以使typeSet
,因此存在冲突(这是编译器告诉您的)
只需调整类型注释,即可:
let donefiles : Set<FileRecord> ref = ref Set.empty
您是否可以使用可变的哈希集
?哈希集似乎没有差异函数。您可以使用。ExceptWith
从哈希集
删除项目集合。您是否可以使用可变的哈希集
,而不是可变的哈希集的可变引用HashSet
?HashSet似乎没有差异函数。您可以使用。ExceptWith
从HashSet
中删除项目集合。它几乎成功了!通过您的更改(谢谢!),变量声明起作用了,但是闭包定义没有起作用:我得到了错误“值是不可变的”。我尝试了donefilesdonefiles:=Set.add文件!donefiles
成功了(必须解除var)它几乎成功了!通过您的更改(谢谢!),变量声明起作用了,但是闭包定义没有起作用:我得到了错误“值是不可变的”。我尝试了donefilesdonefiles:=Set.add文件!donefiles
有效(必须解除var)
donefiles := Set.add file !donefiles