module Main where import System.Environment (getArgs) import Control.Applicative import Control.Arrow import Control.Monad.Fix import Control.Monad.Identity import Data.Function.YaMemo import Data.Map (Map) -- Functional for cc (Change Coins) coinsUS :: [Int] coinsUS = reverse [1,5,10,25,50] coinsGB :: [Int] coinsGB = reverse [1,2,5,10,20,50,100,200] memoTable :: (Memo Map) ([Int], Int) Int memoTable = undefined ccF :: (Monad m, Applicative m) => (([Int], Int) -> m Int) -> ([Int], Int) -> m Int ccF _ (_ , n) | n < 0 = return 0 ccF _ ([1] , _) = return 1 ccF f (ccs@(c:cs), n) = (+) <$> f (cs,n) <*> f (ccs,n - c) cc :: ([Int], Int) -> Int cc = memo memoTable ccF main :: IO () main = print $ cc (coinsGB, 200)