seq<IHierarchy>
no'lu diziyi bir hiyerarşiye dönüştüren bir işlev yapmaya çalışıyorum. Esasen, bir ebeveyn kimliği ve bir çocuk grubu olan her şey bir hiyerarşiye dönüştürülebilmelidir. Hiyerarşi yapmak için altyazı ve alt özellikleri olan bir taban sınıfı [kayıtlar mühürlü sınıflar olarak yapamıyoruz] yerine, her sınıf için uyguladığımız iki soyut alanla (ebeveynlik ve çocuklar) bir IHiyerarşi yapmanın mümkün olup olmadığını merak ediyordum. .F #:
Düz bir seq<IHierarchy>
IHierarchies'in hiyerarşi yapısına dönüştürmeye çalışan makeHierarchy işlevi de dahil olmak üzere aşağıdaki kodu ekledim. Ancak, kayıt kopyasını kullanmayı ve sözdizimini güncellediğimde (örneğin: {node with children = ...}) "IHierarchy türü bir alan çocuğu içermiyor" diyerek bir hata alıyorum. Arayüzde bu tür için çalışmak için sözdizimi {with} kaydı nasıl elde edeceğimi biraz kafam karıştı. Bu mümkün değil mi? F # için oldukça yeni olduğum için herhangi bir yardım mutluluk duyacağız.
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))
IHeirachy bir kayıt değildir, bu nedenle kayıt sözdizimini kullanamazsınız. –
Ben de böyle düşündüm. Bu sorunu çözmek için F # tasarım deseninde herhangi bir öneriniz var mı? Tümüyle düşündüğüm seçenekler kötü görünüyor: 1. Bir kayıt türü kullanmayın, ebeveyn kimliği ve alt alanlar içeren bir temel sınıf kullanın ve bu temel sınıftan doğrudan doğruya 2. Bir klonlama işlevinin bir parçası olarak kullanın. Arayışım, çocukların alanlarını değiştirebilir hale getir, fonksiyonumda kayıt klonu ve sonra da çocuk alanını el ile değiştir. Her ikisi de IHierarchy arabiriminin bir parçası olduğundan, bu bir sorun olmamalı, ancak çirkin görünüyor. – gnicholas
Zarif bir alternatif göremiyorum. –