Haskell递增元组的最后一个元素

时间:2012-07-07 18:44:55

标签: list haskell tuples

您好,请您帮我解决如何增加元组的最后一个元素的问题。 目前我有这个元组列表

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

1 个答案:

答案 0 :(得分:5)

这还不错,但是让我们假装你试图增加“Squash”,这是你的示例项目列表中的第二个元素。 sales做了什么?它检查列表中的第一个项目Water是否等于壁球。由于水不等于挤压,因此会遇到otherwise情况并返回[]

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

修复otherwise分支后,你会注意到你增加的项目被丢弃之后的整个列表 - 我认为一旦你完成这个问题就会突然出现。

P.S。解雇将壁球放入饮酒区的员工。