Çocukken başka bir metin düğümüne sahip olabilecek metin düğümleri gibi bir ağaç yapısına sahibim ve bir değeri güncellemem gerekiyor. Bu ağacın derinliklerinde bir yer olan metin düğümünü güncellemenin en kolay yolu nedir (ya da o ağacın içinde değil)?Özyineleme türünde güncelleme değeri - elm lang
Değişken olmayan bir dilde, sadece bu öğenin değerini değiştirirdim, ve bu kadar, ama Elm gibi değişmez bir dilde oldukça zor.
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)
bu
benupdateItem: 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 }
ile geldi ama rootItem
dönen yerine çünkü ben bir Maximum call stack size exceeded
hatayı
Mükemmel yanıt! Benim günümü yaptın :) –
Bu kalıbı kullanarak Öğelerin iç içe geçmiş listesini nasıl güncelleştiririm? Vurduğum sorun, kayıt güncelleme ifadesinin, içinde göründüğü herhangi bir işlevin dönüş ifadesi olacak şekilde tasarlanmasıdır. Yeni bir Öğe oluşturmak için tasarlanmış bir işlevdir, dönüş ifadesi, öğenin değil, yeni öğe olmalıdır. Ebeveynlerin çocuk listesi, güncellemem gerekenler. Özyinelemeli (aka "tree") yapılarla nasıl baş edileceğine dair bir yazgımız var mı? Öğeyi bir tür takma ad ve koleksiyon türünde yapma hakkında talimatlar gördüm; farklı bir protokol sunuyorsunuz. –
@RichardHaven, harita işlevi tarafından ele alındığında, gövdesinde, Düğüm tarafından verilen ve muhtemelen işlev tarafından değiştirilen öğeden oluşan bir Düğüm ve Düğümden gelen çocukların her birinin de verildiğini fark eder. muhtemelen işlev tarafından değiştirildi. Sonuçta, updateById'yi haritaya beslerken, değiştirilen bir öğe dışında, aynı parçaları kullanarak düğüm ağacını yinelemeli olarak oluşturacaktır. –