Mam strukturę drzewa węzłów tekstowych, które mogą mieć inny węzły tekstowe jak dzieci, i muszę zaktualizować jedną wartość w nim. Jaki jest najłatwiejszy sposób aktualizacji węzła tekstowego, który znajduje się gdzieś głęboko w tym drzewie (lub w ogóle nie jest w tym drzewie)?Aktualizacja wartości w typie rekurencyjnej - wiąz lang
w języku non-niezmiennej, chciałbym po prostu zmienić wartość tej pozycji, i to wszystko, ale jest to dość trudne w niezmiennej języku jak Elm.
type alias Item =
{ id: String
, text: String
, children: ChildItems
}
type ChildItems = ChildItems (List Item)
type alias Model =
{ rootItem: Item
}
updateItem: Item -> Item -> Item
updateItem: rootItem item =
-- TODO
...
update model =
case msg of
UpdateItem item updatedText ->
let
updatedItem = { item | text = updatedText }
in
({ model | rootItem = (updateItem model.rootItem updatedItem) }, Cmd.none)
to co wymyśliłem
updateItem: Item.Item -> Item.Item -> Item.Item
updateItem rootItem updatedItem =
if rootItem.id == updatedItem.id then
updatedItem
else
case rootItem.children of
Item.ChildItem [] ->
rootItem
Item.ChildItem children ->
let
updatedChildren =
case children of
[] ->
[]
children ->
List.map (\item ->
updateItem rootItem item) children
in
{ rootItem | children = Item.ChildItem updatedChildren }
ale dostaję błąd Maximum call stack size exceeded
Doskonała odpowiedź! Zrobiłeś mój dzień :) –
Jak zaktualizować zagnieżdżoną listę przedmiotów, używając tego wzoru? Problem mam trafienia jest, że wyrażenie zmiana rekordu ma być wyrazem powrotu dowolnej funkcji wydaje in.I na działanie mające na celu utworzyć nowy element, wyrażenie powrotny powinien być nowy element, a nie elementu lista rodziców dziecka, którą muszę zaktualizować. Czy mamy pismo święte o tym, jak radzić sobie z strukturami rekurencyjnymi (zwanymi "drzewami")? Widziałem instrukcje dotyczące uczynienia elementu aliasem i kolekcją typu; oferujesz inny protokół. –
@RichardHaven, który jest obsługiwany przez funkcję mapowania - zauważ, że w jej ciele tworzy Węzeł złożony z elementu z Węzła, który został podany, ewentualnie zmodyfikowany przez funkcję, oraz potomków z Węzła, który został podany, każdy także ewentualnie zmodyfikowane przez funkcję. Docelowo podczas ładowania pliku updateById do mapy rekurencyjnie zbuduje drzewo węzłów przy użyciu tych samych elementów, z wyjątkiem jednego elementu, który został zmieniony. –