Как инициализировать взаимно рекурсивные записи в F#

У меня есть две записи, которые имеют отношения родитель-ребенок:

type Parent = 
  { Number: int
    Child: Child }
and Child = 
  { String: string
    Parent: Parent }

Я попытался инициализировать их, используя следующий синтаксис, который не работает:

let rec parent = 
  { Number = 1
    Child = child }
and child = 
  { String = "a"
    Parent = parent }

это ведет к

parent : Parent = { Number = 1
                    Child = null }
child : Child = { String = "a";
                  Parent = { Number = 1 
                             Child = null } }

Как их инициализировать, не полагаясь на изменяемые поля или копировать и обновлять после фактического использования with?

1 ответ

Решение

Вот синтаксис для его инициализации:

let rec parent = 
  { Number = 1
    Child = 
      { String = "a"
        Parent = parent } 
  }

Результат:

parent : Parent = { Number = 1
                    Child = { String = "a"
                              Parent = ... } }

Обратите внимание, что, как описано в этом ответе, этот синтаксис может быть скорее случайным, чем преднамеренным, и не будет работать для более чем простых самоссылок (например, передача рекурсивного значения в функцию).

Другие вопросы по тегам