簡體   English   中英

F# 中“不可變”列表的混淆

[英]Confusion on "Immutable" lists in F#

完全新手問題。

我仍在嘗試掌握 F# 中的“不可變”列表。

讓我們假設我有一個“訪問”定義為:

module Visit =
    type Model =
        {
            Name: string
        }

    let init row col cel =
        { 
            Name = sprintf "My Name is row: %d col: %d  cel: %d" row  col cel       
        }

現在我定義了一個可能有也可能沒有一次訪問的“單元格”:

module Cell =
    type Model =
        {
            Visit: Visit.Model option
        }

    let setVisit m =
        { m with Visit = Some( Visit.init 9 9 9) }

最后我定義了一個包含單元格列表的“列”:

module Column =
    type Model =
        {         
            Appointments: Cell.Model list
        }


    let updateCell (m:Model) =
        let newList = m.Appointments |> List.mapi (fun index cell -> if index = 2 then Cell.setVisit cell else cell)
        {m with Appointments = newList }

在 Column 模塊中,“updateCell”函數被連接到為第三個單元格調用 Cell.setVisit。 我的意圖是替換第三個單元格持有的“訪問”的“名稱”。 我的簡單問題是:

  1. 這是正確的方法嗎?
  2. 如果我要替換約會列表,這是否不會更改保存約會列表的“列”? (列是不可變的,對吧?)。

對不起,我的困惑。

TIA

第一:是的,這是一種可以接受但效率低下的列表方式。 請注意,您在每次updateCell調用時都會重建整個列表,即使其中的大多數元素都相同。

我不知道您在實踐中希望在您的模型中有多少約會。 如果它明顯多於三個,並且您總是更新第三個,那么剪切列表會更有效,然后將其重新粘在一起:

let newList = List.take 2 m.Appointments @ [Cell.setVisit m.Appointments.[2]] @ List.drop 3 m.Appointments

這樣只重建了前三個元素,並重用了列表的尾部。

但是,如果您需要隨機訪問操作,我可以建議改用數組嗎? 當然,它們是可變的,但它們為隨機訪問操作提供了更好的性能。

第二:不,語法{ m with ... }不會改變Column 相反,它會創建一個列 - m的副本,但所有字段都列在后面with更新為新值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM