2017-02-02 1 views
0

Je suis un peu novice dans FP et Haskell et j'essaie de résoudre des tâches triviales. Par exemple, nous avons gamme de produits:Solution de programmation fonctionnelle

data Product = Product String Int 
let apple = Product "Apple" 15 
let pineapple = Product "Pineapple" 20 
let products = [apple, pineapple] 

Les tâches:

  • calculer le prix total des produits (ce qui est simple, par exemple, je peux utiliser foldl)
  • calculer le prix total si chaque troisième pomme a un rabais 0.5
  • calculer le prix total si l'ananas est libre en cas d'achat de deux pommes.

Dans la programmation impérative traditionnelle, ceci est assez simple, par exemple je peux utiliser différentes stratégies de calcul pour cela. Comment puis-je résoudre cela dans Haskell? Devrais-je utiliser la monade d'État ou existe-t-il d'autres solutions? Pourriez-vous s'il vous plaît fournir quelques étapes ou code d'algorithme?

+1

À moins que le prix d'un ananas/pomme ne puisse changer, aucun d'entre eux n'a même besoin de 'State' - juste filtrer votre liste de produits pour obtenir le compte de toutes les pommes ou ananas. Ensuite, il revient à l'arithmétique sur ces deux chiffres. – Alec

Répondre

0

Pour faire le deuxième problème (pour lequel la solution peut être modifiée pour résoudre le troisième problème) cela peut être résolu assez facilement en utilisant récursion

totalPriceWithBuy2ApplesGet1HalfOff :: [Product] -> Int 
totalPriceWithBuy2ApplesGet1HalfOff = go 0 
    where 
     -- It doesn't matter how many apples you've seen, the total 
     -- price of 0 items is 0 
     go applesSeen [] = 0 
     -- If you've seen 2 apples already and the next product is 
     -- an Apple, give discount 
     go 2 (Product "Apple" price : products) = 
      price `div` 2 + go 0 products 
     -- If applesSeen is some other number and you encounter an apple, 
     -- add its price and increment applesSeen 
     go applesSeen (Product "Apple" price : products) = 
      price + go (applesSeen + 1) products 
     -- For any other product just add the price to the total and recurse 
     go applesSeen (Product _ price : products) = 
      price + go applesSeen products 

Cela fonctionne même si vos pommes ne sont pas tous les même prix, bien que ce serait un magasin vraiment étrange pour faire du shopping.