В F #, как обновить / заменить вложенную запись, используя индекс списка?

#f#

#f#

Вопрос:

(Совершенно новичок).

Пожалуйста, предположите следующее в F#

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

module Column =
    type Model =
        {  AppointmentCount: int
           InnerRows: Cell.Model list } 

module App = 
 ...stuff with List.tryFind to return an open column ...

  let AddVisit (c:Column.Model, v:Visit)  =
                { c with c.InnerRows[AppointmentCount] = { c.InnerRows[AppointmentCount] with Visit = v } }
  

Предполагая, что в столбце будет 4 ячейки, посещение предоставляется при чтении базы данных, а экземпляр столбца находится через пару List.tryFind, может ли вложенная запись (т. Е. Посещение ячейки) быть заменена / обновлена с помощью AppointmentCount в качестве индекса?

То есть это не удается:

 let AddVisit (c:Column.Model, v:Visit)  =
            { c with c.InnerRows[AppointmentCount] = { c.InnerRows[AppointmentCount] with Visit = v } }
  

Ошибка: привязки полей должны иметь вид ‘id = expr,’

Спасибо.

Ответ №1:

Возьмем, к примеру, недавно созданную запись.

 let myRecord2 = { MyRecord.X = 1; MyRecord.Y = 2; MyRecord.Z = 3 }
  

Чтобы обновить только два поля в этой записи, вы можете использовать выражение копировать и обновлять запись:

 let myRecord3 = { myRecord2 with Y = 100; Z = 2 }
  

Копирование и обновление выражений записи

Комментарии:

1. Извините… Как будет записан индекс во вложенную запись?

Ответ №2:

 let AddVisit (c:Column.Model, v:Visit)  =
            { c.InnerRows.[c.AppointmentCount]  with Visit = Some v } 
  

Обратите внимание, что c.InnerRows.[c.AppointmentCount] указывает конкретную ячейку.модель, для которой будет установлено посещение. (Кроме того, «.» перед [ допускает прямое индексирование в список.