0

これは、私が立ち往生している過去の試験問題からの質問です。助けてください。

スーパーマーケットの請求書のタイプが与えられています。請求書の各エントリには、製品の名前、この製品の購入数、および 1 つの製品の価格が含まれています。

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

指定された請求書が製品名と請求書の最も高価なエントリの合計コストを返すように関数mostExpensiveを定義します (製品のアイテムが購入されたことを考慮してください)。そのような製品が 1 つだけあると仮定します。

4

3 に答える 3

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)
于 2013-04-16T20:37:15.213 に答える
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
于 2013-04-16T18:34:47.533 に答える