Поиск…


Вступление

zipWithM - это zipWith поскольку mapM должен map : он позволяет объединять два списка, используя монадическую функцию.

Из модуля Control.Monad

Синтаксис

  • zipWithM :: Аппликация m => (a -> b -> mc) -> [a] -> [b] -> m [c]

Вычисление отпускных цен

Предположим, вы хотите узнать, имеет ли определенный набор цен продажи смысл для магазина.

Первоначально изначально стоимость составляла 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

Это не вернет Nothing если какая-либо из продажных цен будет ниже 5 долларов США.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow