这是一篇来自过去的试卷的问题,我坚持认为。请帮忙。
鉴于超市票据的类型。账单的每个条目都包含名称 一个产品,这个产品的购买数量,以及一个的价格 单品。
type Product = String
type Count = Float -- type chosen for simple arithmetic
type Price = Float
type Bill = [(Count, Product, Price)]
定义一个函数 mostExpensive ,给定一个账单将返回产品名称 和最昂贵的条目的总成本(考虑如何 购买了许多产品)。假设只有一个 这样的产品。
答案 0 :(得分:6)
在Data.List
中,有一个名为maximumBy
的函数在这里很有用。它需要一个进行比较的功能。要编写该函数,我们将在Data.Ord
中使用名为comparing
的函数。我们现在需要的是一种说明我们想要比较的 的方法。所以,如果我们定义:
calcPrice (k, _, p) = k*p
然后我们可以使用:
获得结果maximumBy (comparing calcPrice) items
有了这个,我认为你可以解决问题。
答案 1 :(得分:0)
这是一个更新手的方法,也可以完成这项工作。可能在优雅等级上得分,但非常简单。
如果你自己写的话,不要偷看下面。我打赌它比这短: - )
您应该能够调用ghci中的每个组件函数将其拆开。
type Product = String
type Count = Float -- type chosen for simple arithmetic
type Price = Float
type Bill = [(Count, Product, Price)]
type LinePrice = (Product, Price)
myBill :: Bill
myBill = [ (4.0, "Bananas", 0.30), (1.0, "Apple", 0.50), (2.0, "Eggs", 0.25) ]
priceList :: Bill -> [LinePrice]
priceList = map (\(ct,prd,prc) -> (prd, ct*prc))
maxItem :: [LinePrice] -> LinePrice
maxItem lst = maxItem_m ("none",0.0) lst
maxItem_m :: LinePrice -> [LinePrice] -> LinePrice
maxItem_m max [] = max
maxItem_m (prd_m,prc_m) ((prd,prc):rest)
| prc > prc_m = maxItem_m (prd,prc) rest
| otherwise = maxItem_m (prd_m,prc_m) rest
main = do
let mostExpensive = maxItem $ priceList myBill
print mostExpensive
答案 2 :(得分:0)
感谢所有帮助人员,但我用这个作为我的最终答案,并使用编译器检查,它有效:)
mostExpensive :: Bill -> (Price, Product)
mostExpensive [] = (0, "No Products in Bill")
mostExpensive a = head (reverse(sort (map getTotal2 a)))
where getTotal2 :: (Count, Product, Price) -> (Price, Product)
getTotal2 (a,b,c) = ((a * c), b)