计算销售价格

假设你想要查看某组销售价格是否对商店有意义。

这些物品原本花费 5 美元,所以如果销售价格低于其中任何一个,你不想接受销售,但你确实想知道新价格是多少。

计算一个价格很简单:你计算销售价格,如果你没有获利,则返回 Nothing

calculateOne::Double -> Double -> Maybe Double
calculateOne price percent = let newPrice = price*(percent/100)
                             in if newPrice < 5 then Nothing else Just newPrice

为了计算整个销售,zipWithM 让它非常简单:

calculateAllPrices :: [Double] -> [Double] -> Maybe [Double]
calculateAllPrices prices percents = zipWithM calculateOne prices percents

如果任何销售价格低于 5 美元,这将返回 Nothing