【发布时间】:2021-07-07 16:47:04
【问题描述】:
我有一个表示产品的元组:
type Product = (String, Int, Float)
String 是名称,Int 是数量,Float 是价格或价值。
现在我想做以下事情: 我有一个产品列表,我想在该列表中添加一个新产品。 但如果产品已经在列表中,我只想增加数量。 (现在我不在乎如果价格/价值不一样会发生什么)
“如果已经在列表中,则增加该产品的数量。否则将其添加到列表中”
示例输入:("Beer", 9, 3) [("Beer", 1, 3),("Milk", 3, 3),("Tea", 10, 3)]
预期输出:[("Beer", 10, 3),("Milk", 3, 3),("Tea", 10, 3)]
或
示例输入: ("Apple", 2, 1) [("Beer", 1, 3),("Milk", 3, 3),("Tea", 10, 3)]
预期输出:[("Beer", 1, 3),("Milk", 3, 3),("Tea", 10, 3),("Apple", 2, 1)]
(列表没有顺序,因此新产品在列表中的位置无关紧要)
addProduct :: Product -> [Product] -> [Product]
听起来很简单,实际上我有一个工作方法可以做到这一点:
-- check if a name is inside a List
nameInList :: String -> [Product] -> Bool
nameInList n [(a,b,c)] = if (a == n) then True else False
nameInList n ((a,b,c):xs) = if (a == n) then True else nameInList n xs
-- add a product to a list if its not already in that list else just increase amount of that product
addProduct :: Product -> [Product] -> [Product]
addProduct (a,b,c) xs = if nameInList a xs then newList else (a,b,c) : newList
where newList = [ (a2,b2+b,c2) | (a2,b2,c2) <- xs, a2 == a ] ++ [ (a2,b2,c2) | (a2,b2,c2) <- xs, a2 /= a]
但我想知道是否可以使用模式匹配和递归以某种方式实现相同的目标。我也觉得没有其他功能进行检查应该是可能的。
【问题讨论】:
标签: haskell