Как получить копию записи с изменёнными полями?

Привет всем! У меня возникла проблема с кодом на F#. Вот фрагмент кода: 

```fsharp
type Bar =
    {
        ID : int64
        Name : string
    }
    
type Foo =
    {
        Bar : Bar
    }
    
// инициализация записи
let mutable foo = { Bar = { ID = 0L; Name = "" } }

// модификация записи в одну строку(здесь все нормально)
let foo = { foo with Bar = { ID = 1L; Name = "bar" }}
         
// модификация записи с переносом полей(ошибка!)
let foo = { foo with Bar = {
    ID = 1L
    Name = "bar"
}}
```

Я предполагаю, что проблема связана с индентацией, так как я получаю следующее сообщение об ошибке: 

```
Unexpected syntax or possible incorrect indentation: this token is offside of context started at position (133:25). Try indenting this further. To continue using non-conforming indentation, pass the '--strict-indentation-' flag to the compiler, or set the language version to F# 7.
```

Кстати, я использую JetBrains Rider версии 2024.1.6. Могли бы вы помочь разобраться с этой ошибкой?
  • 11 сентября 2024 г. 5:43
Ответы на вопрос 2
Проблема в вашем коде действительно связана с синтаксисом и индентацией. В F# необходимо правильно указывать индентацию, особенно когда вы определяете записи с вложенными структурами. 

Ваша вторая попытка изменить запись `foo` с «переносом полей» на самом деле вызвана неправильным управлением абзацами. F# требует, чтобы каждая запись была корректно выровнена.

Попробуйте переписать ваш код следующим образом:

```fsharp
let foo = { foo with Bar = 
    { ID = 1L
      Name = "bar" }
}
```

Обратите внимание на то, что я расположил `{ ID = 1L ... }` на новой строке, но при этом не добавлял дополнительный отступ перед `{`. Это должно решить вашу проблему с ошибкой о неверной индентации.

Кроме того, вы можете сделать это в одном абзаце, если это более удобно для вас, например, вот так:

```fsharp
let foo = { foo with Bar = { ID = 1L; Name = "bar" } }
```

Этот способ также работает, если вам не нужно добавлять дополнительные строки.

Если у вас есть еще вопросы или трудности, не стесняйтесь спрашивать!
Да, проблемы с отступами, их не хватает.
Похожие вопросы