Во-первых, вы не можете «обновить» 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
mutable, он просто переопределяется. Это допускается внутри функций, и 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)]
, как и ожидалось.
+1 Этот ответ абсолютно прав. Небольшой момент - вам не нужно менять «map1.Add» на что-то вроде '(3,4) ||> Map.add <| map1' - I Совершенно верно, чтобы мутировать карту, произнеся «map1 <- map1.Add (3,4)» (и я определенно предпочел бы, чтобы это использовало причудливых операторов, чтобы запутать врага :-)) –
@TomasPetricek: Благодарим вас за напоминание о том, что иногда использование методов экземпляра типа может быть предпочтительным для ввода функций модуля. –