2

嗨,您能否帮助我了解如何增加元组的最后一个元素。目前我有这个元组列表

items :: [Grocery]
items = [("Water", "Drink Section", 1),
         ("Squash", "Drink Section", 1),
         ("Apple", "Fruit Section", 1),
         ("Plates", "Disposable Section", 1),
         ("Plates", "Ceramic Section", 1)]

我想做的是每次购买商品时将其增加 1 并输出数据库。目前我有这个

sales:: [database] -> String -> String-> [database]
sales db itemName sectionName = []
sales ((item, section, qty): xs) itemName sectionName 
     | item == itemName && section== sectionName = [(item, section, qty + 1)]
     | otherwise = []

我仍然在增加它并且我卡住了。请帮助我,我还是这门语言的新手。谢谢你!

编辑

现在一切正常,但你如何输出列表的其余部分?我试过recordSale xs trackArtist trackTitle了,但是当我测试它时,我增加的旧记录也会被打印而不是被修改?假设我增加了苹果它将打印的是这个

[("Apple", "Fruit Section", 2),("Water", "Drink Section", 1),("Squash", "Drink Section", 1), ("Apple", "Fruit Section", 1)]

它复制记录而不是仅仅添加 1

4

1 回答 1

5

这还不错,但是让我们假设您正在尝试增加“Squash”,即示例项目列表中的第二个元素。做什么sales?它检查列表中的第一个项目 Water 是否等于 Squash。由于水不等于壁球,因此它会碰到otherwise箱子并返回[]

所以所有这一切似乎都是正确的,直到我们得到[]支持 - 让我们更改代码。显然我们不想扔掉整个列表,那将是愚蠢的。您应该重写它以保留刚刚比较的项目并将其连接到sales应用于列表其余部分的结果 ( xs)。

在你otherwise修复了那个分支之后,你会在你增加的项目被扔掉之后注意到整个列表——我认为一旦你完成了这个问题,一个会突然出现在你身上。

PS 解雇将 Squash 放入饮水区的员工。

于 2012-07-07T18:56:15.740 回答