मेरे पास टेक्स्ट नोड्स की संरचना जैसे पेड़ हैं जिनके पास बच्चों के रूप में एक और टेक्स्ट नोड हो सकते हैं, और मुझे इसमें एक मान अपडेट करना होगा। टेक्स्ट नोड को अपडेट करने का सबसे आसान तरीका क्या है जो उस पेड़ में कहीं गहरा है (या यह उस पेड़ में बिल्कुल नहीं है)?एक रिकर्सिव प्रकार में अद्यतन मूल्य - elm lang
एक गैर-अपरिवर्तनीय भाषा में, मैं बस उस वस्तु का एक मूल्य बदल दूंगा, और यही वह है, लेकिन यह एल्म जैसी अपरिवर्तनीय भाषा में काफी मुश्किल है।
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)
इस
क्या मैं
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 }
के साथ आया है, लेकिन मैं एक Maximum call stack size exceeded
त्रुटि
उत्कृष्ट उत्तर! आपने मेरा दिन बनाया है :) –
मैं इस पैटर्न का उपयोग कर आइटम की नेस्टेड सूची कैसे अपडेट करूं? समस्या जो मैं मार रहा हूं वह यह है कि रिकॉर्ड अपडेट अभिव्यक्ति को किसी भी फ़ंक्शन की वापसी अभिव्यक्ति के रूप में डिज़ाइन किया गया है। मैं एक नया आइटम बनाने के लिए डिज़ाइन किया गया फ़ंक्शन, वापसी अभिव्यक्ति नया आइटम होना चाहिए, आइटम की नहीं माता-पिता की बच्चों की सूची, जो मुझे अद्यतन करने की आवश्यकता है। क्या हमारे पास रिकर्सिव (उर्फ "पेड़") संरचनाओं से निपटने के तरीके पर शास्त्र है? मैंने आइटम को एक प्रकार के उपनाम और संग्रह को एक प्रकार बनाने के निर्देश देखे हैं; आप एक अलग प्रोटोकॉल की पेशकश करते हैं। –
@ रिचर्डहेवन जिसे मानचित्र फ़ंक्शन द्वारा संभाला जाता है - ध्यान दें कि उसके शरीर में यह नोड से आइटम से बना नोड बनाता है, जिसे संभवतः फ़ंक्शन द्वारा संशोधित किया गया था, और नोड के बच्चों को यह दिया गया था, प्रत्येक भी संभवतः समारोह द्वारा संशोधित। आखिरकार जब अद्यतन करने के लिए मानचित्र में अद्यतन किया जाता है तो यह एक ही टुकड़े का उपयोग करके नोड्स के पेड़ को फिर से बना देगा, जो एक आइटम को बदल दिया गया है। –