Как инициализировать взаимно рекурсивные записи в 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 = ... } }
Обратите внимание, что, как описано в этом ответе, этот синтаксис может быть скорее случайным, чем преднамеренным, и не будет работать для более чем простых самоссылок (например, передача рекурсивного значения в функцию).