如果我有一个数据列表[Item],那么在其中定位和更改元素的最佳方法是什么。
aList : [Item]
searchName : Text
newPrice : Decimal
- I can find the element using
let a : Optional Int = findIndex (\a -> a.name == searchName) aList
-but this doesn't change the value of the List
let (aList !! fromSome a).price = newPrice
data Item = Item
with
name : Text
price : Decimal
deriving (Eq, Show)
答案 0 :(得分:1)
DAML中的值是不可变的-这意味着一旦创建了列表,就无法更新其中的任何值。但是,有很多辅助功能可用于创建新列表,就像旧列表一样,但有一些更改。例如:
let newList = map (\a -> if a.name == searchName then a{price = newPrice} else a) aList
map
函数采用列表中的每个元素并应用给定的函数。我们传递的函数会更改名称正确的price
,并返回所有其他不变的名称。请注意,与您的版本不同,这会用searchName
而不是仅更改第一个项目-我假设这是可以的(但是,如果不行,请查看类似partition
的函数来首先分割列表)。 / p>