在while循环中更新FSharpMap

时间:2013-12-15 01:42:01

标签: map f# local mutable

[<EntryPoint>]
let main argv = 
    let linshi1 = [|1,2|]
    let linshi2 = Array.append linshi1 [|2,3|]
    let map1 = Map.ofArray linshi2
    let mutable it = 1
    while it = 1 do 
        it <- it - 1
        let map2 = map1.Add(3,4)
        let map1 = map2
        printfn "!\n"
    printfn "done"
    0

这是我的测试代码。我正在尝试更新&#34; map1&#34;在while循环中但结果显示我失败了。那我怎么能实现这个功能呢?我真的需要在阅读Excel文件时更新地图。提前谢谢。

1 个答案:

答案 0 :(得分:4)

首先,你不能“更新”F# map,因为它是不可变的数据结构,即添加到地图会产生另一个地图。目前尚不清楚如何通过更新地图来对齐Excel,但您总是可以执行类似

的操作
let mutable myMap = ...
......
myMap <- (x,y) ||> Map.add <| myMap

创建旧的地图实例,然后将原始引用指向丢弃前一个的新内容。

其次,当您使用while表达式时,它会创建一个新范围,以便let map1=...map1之外隐藏“原始”while。当控制权回到map1之外时,这个“内部”while会被丢弃。这就是为什么while内的操作无论如何都不会影响你的“原始”map1。有关范围和阴影的详细信息,请参阅FSharp Programming/Basic Concepts

总结一下,你不需要任何while循环;只需将您的代码段转换为类似下面的代码段,而不是将map1变为可变,只需重新定义即可。在函数内部允许这样做,而main确实是一个函数:

[<EntryPoint>]
let main argv = 
    let linshi1 = [|1,2|]
    let linshi2 = Array.append linshi1 [|2,3|]
    let map1 = Map.ofArray linshi2
    let map1 = (3,4) ||> Map.add <| map1
    printfn "%A" map1
    0
正在执行的

将按预期输出map [(1, 2); (2, 3); (3, 4)]