F #: ошибка при попытке скопировать и обновить запись через интерфейс
Я пытаюсь сделать функцию, которая превращает любую квартируseq<IHierarchy>
в иерархию. По сути, все, что имеет parentID и последовательность потомков, должно быть в состоянии быть превращено в иерархию. Вместо того, чтобы сделать Hierarchy базовым классом со свойствами parentID и потомков [мы не можем, поскольку записи являются запечатанными классами], мне было интересно, можно ли сделать его IHierarchy с двумя абстрактными полями, которые мы реализуем для каждого класса (parentID и дочерние элементы) ,
Я приложил приведенный ниже код, включая функцию makeHierarchy, которая пытается превратить квартируseq<IHierarchy>
в иерархическую структуру IHierarchies. Однако, когда я пытаюсь использовать синтаксис записи и обновления записи (то есть: {узел с детьми = ...}), я получаю сообщение об ошибке «Тип IHierarchy не содержит поле потомков». Я немного запутался, как заставить синтаксис record {with} работать для этого типа в интерфейсе. Разве это не возможно? Любая помощь будет оценена, так как я довольно новичок в F #.
module Hierarchy =
type IHierarchy =
abstract member parentID: Option<int>
abstract member children: seq<IHierarchy>
module SalesComponents =
open Hierarchy
type SalesComponentJson = JsonProvider<""" [{ "ID":1, "parentID":0, "name":"All Media" }, { "ID":1, "parentID":null, "name":"All Media" }] """, SampleIsList=true>
type SalesComponent = {
ID: int;
parentID: Option<int>;
children: seq<SalesComponent>;
name: string
}
interface IHierarchy with
member x.parentID = x.parentID
member x.children = x.children |> Seq.map (fun c -> c :> IHierarchy)
open Hierarchy
open SalesComponents
let main argv =
let makeHierarchy hierarchyRecords:seq<IHierarchy> =
let root = hierarchyRecords |> Seq.tryFind (fun sc -> sc.parentID.IsNone)
let rec getHierarchy (node: IHierarchy, scs: seq<IHierarchy>) =
{node with children = scs |> Seq.filter (fun sc -> sc.parentID.IsSome && sc.parentID.Value = node.ID )
|> Seq.map (fun sc -> getHierarchy(sc,scs))}
root |> Option.map (fun r -> getHierarchy(r,hierarchyRecords) )