[英]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。 我的意圖是替換第三個單元格持有的“訪問”的“名稱”。 我的簡單問題是:
對不起,我的困惑。
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.