#! /usr/bin/env runhaskell data Ingredient = Ingredient { ingredientName :: String , unit_cost :: Double }deriving (Show) data UsedIngredient = UsedIngredient { ingredient :: Ingredient, quantityUsed :: Double }deriving (Show) data Recipe = Recipe { recipeName :: String , billOfMaterial :: [ UsedIngredient ] , finalQuantity :: Double , useNumber :: Double }deriving (Show) recipeCost :: Recipe -> Double recipeCost (Recipe _ bom _ _) = sum . map ingredientCost $ bom ingredientCost :: UsedIngredient -> Double ingredientCost (UsedIngredient (Ingredient _ uCost) qtt) = uCost * qtt unitCost :: Recipe -> Double -> Double unitCost (Recipe _ _ qtt _) totalCost = totalCost / qtt useCost :: Recipe -> Double -> Double useCost (Recipe _ _ _ uses) totalCost = totalCost / uses (→) :: Ingredient -> Double -> UsedIngredient (→) ingredient qtt = UsedIngredient ingredient qtt eau = Ingredient "Eau" 0.003 savonMarseille = Ingredient "Savon de Marseille" 3.36 bicarbonate = Ingredient "Bicarbonate de soude" 3.81 vinaigreBlanc = Ingredient "Vinaigre blanc" 0.36 lessive :: Recipe lessive = Recipe "Lessive" [ eau → 2.5 , savonMarseille → 0.1 , bicarbonate → 0.016 , vinaigreBlanc → 0.03 ] 2.5 30 main = do putStrLn "Calcul du coût des recettes\n" putStrLn "* Lessive :" print lessive let lessiveTotalCost = recipeCost lessive lessiveUnitCost = unitCost lessive lessiveTotalCost lessiveUseCost = useCost lessive lessiveTotalCost putStrLn $ " * Prix Total = " ++ show lessiveTotalCost ++ "€" putStrLn $ " * Prix au litre = " ++ show lessiveUnitCost ++ "€" putStrLn $ " * Prix par utilisation = " ++ show lessiveUseCost ++ "€"