比较元组列表以查找开票清单中最昂贵的项目

时间:2013-04-16 17:10:24

标签: haskell tuples

这是一篇来自过去的试卷的问题,我坚持认为。请帮忙。

鉴于超市票据的类型。账单的每个条目都包含名称 一个产品,这个产品的购买数量,以及一个的价格 单品。

type Product = String
type Count = Float -- type chosen for simple arithmetic
type Price = Float
type Bill = [(Count, Product, Price)]

定义一个函数 mostExpensive ,给定一个账单将返回产品名称 和最昂贵的条目的总成本(考虑如何 购买了许多产品)。假设只有一个 这样的产品。

3 个答案:

答案 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)