2013-12-15 1 views
1
[<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 

это мой тестовый код. Я пытаюсь обновить «map1» в цикле while, но результат показывает, что я потерпел неудачу. Итак, как я могу достичь этой функции? Мне действительно нужно обновить карту во время чтения файла Excel. Заранее спасибо.обновить FSharpMap в цикле while

ответ

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 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)], как и ожидалось.

+0

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

+0

@TomasPetricek: Благодарим вас за напоминание о том, что иногда использование методов экземпляра типа может быть предпочтительным для ввода функций модуля. –

 Смежные вопросы

  • Нет связанных вопросов^_^