[<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文件时更新地图。提前谢谢。
答案 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)]
。