Angesichts der folgenden Struktur des Dateisystems:Elm: wie Dict innerhalb Dict aktualisieren, wenn die Struktur dynamisch ist (hat unterschiedliche Tiefe)?
type alias FolderName = String
type Folder
= Folder
{ folderName : String
, childFolders : Dict FolderName Folder
}
type alias FileSystem =
Dict FolderName Folder
fileSystem : FildeSystem
fileSystem =
Dict.formList
[ ("parent1"
, Folder
{ folderName = "parent1"
, childFolders =
Dict.fromList
[ ("child1", Folder { folderName = "child1", childFolders = Dict.empty })
, ("child2", Folder { folderName = "child2", childFolders = Dict.empty })
, ("child3"
, Folder
{ folderName = "child3"
, childFolders =
Dict.formList
[ ("sub-child_of_child3", Folder { folderName = "sub-child_of_child3", childFolders = Dict.empty })
]
}
)
]
}
)
]
Ich möchte neue Ordner erstellen dynamisch der Lage sein, durch eine Funktion und Aufruf in der Lage vorbei, wo ich der neue Ordner erstellt werden soll. Der Ordnername und auch das FileSystem Dict. Etwas wie folgt aus:
createFolder: String -> FileSystem -> FolderName -> FileSystem
createFolder "parent1/child3/sub-child_of_child3" fileSystem "DynamicallyCreated"
Da es keine Möglichkeit im Voraus zu wissen, was die fileSystem Dict
aussieht, und weil diese Ulme ist (no for loops
) - ich denke, der einzige Weg, dies zu tun, ist Rekursion.
Der Code:
createFolder location fileSystem newFolderName=
let
locationAsArray = String.split "/" location
in
// first find the dict value. (that is the value of 'sub-child_of_child3' key, inside 'child3' Dict.)
findDictValueBasedOnLocation locationAsArray fileSystem
// then update the 'sub-child_of_child3' by inserting the newFolder.
|> (\ x -> { x | childFolders = Dict.insert newFolderName Folder { folderName = newFolderName, childFolders = Dict.empty } x.childFolders
// but how to reconsturct the child3, partent1 and finally the fileSystem now? Because this function it's supose to return a new fileSystem that contains the newly created folder.
entsprechenden dict mit Rekursion finden:
findDictValueBasedOnLocation listDictKeys currentDict =
let
currentKey =
List.head listDictKeys
remainingKeys =
List.tail listDictKeys
in
-- when there is only one element in the listDictKeys that is: ["sub-child_of_child3"]- the recursive call stops/
if List.length listDictKeys == 1 then
Dict.get currentKey currentDict
|> Maybe.withDefault -- what to add here?
else
let
nextDict =
Dict.get currentKey currentDict
|> Maybe.withDefault --what to add here ?- don't know the type ..
in
-- recursive call with the remaining listDictKeys and nextDict which is in fact the current Dict value.
findDictValueBasedOnContext remainingKeys nextDict
Sie 2 große Probleme hier sehen können:
- die Dict.get kehrt a Vielleicht und ich weiß nicht, wie ich mit Witz umgehen soll h das in der Rekursion.
- auch wenn ich den entsprechenden Teil des Dict finden und es durch Erstellen des neuen Ordners aktualisieren; - Wie aktualisiere ich, was ich jetzt auf den höheren Ebenen wie
parent1
habe? ex: - bedenke, dass dieses Update auf Level bis zu 20 stattfinden kann. Wie sage ich Level 3 2, 1 über dieses Update?
Ich versuche nicht unbedingt, diesen Code arbeiten zu lassen. Ich habe einen anderen Ansatz, es ist sogar noch besser.
Und konnte keine Beispiele zum Aktualisieren oder Erstellen von Dicts innerhalb Dicts dynamisch finden.
Ich kämpfe dieses Problem für 2-3 Tage jetzt.
Zuerst habe ich versucht, Datensätze anstelle von Dicts - weil sie verschiedene Arten in ihnen ermöglichen. Aber ich konnte nicht record."someString"
verwenden, um auf seinen Wert zuzugreifen - wie in Javascript. Also kein Glück mit Platten. Dicts scheinen vielversprechender zu sein .. hoffe, dass jemand weiß, wie man dieses Problem löst. Danke :)
Sie sind so klug Mann! :)) Vielen Dank, du hast mich gerettet. Ich werde dir zeigen, wofür ich das benutze - sobald es vorzeigbar wird. In erster Linie geht es um die Programmierung in Ulme mit Sprachbefehlen. Vielleicht hilfst du mir, einige Ideen umzugestalten, sobald das erste Demo funktioniert ... ok, viel Glück! – AIon
Gern geschehen. Immer froh zu helfen! – wintvelt