{-# LANGUAGE FlexibleInstances ,OverlappingInstances #-} module Main where import Control.Monad import Data.Function.YaMemo import Data.Map (Map) instance (Monad m, Num a) => Num (m a) where (+) = liftM2 (+) (-) = liftM2 (-) (*) = liftM2 (*) negate = liftM negate abs = liftM abs signum = liftM signum fromInteger = return . fromInteger fibF :: (Num a, Eq a, Num b) => (a -> b) -> a -> b fibF _ 0 = 0 fibF _ 1 = 1 fibF f n = f (n-2) + f (n-1) fib :: Integer -> Integer fib = memo (undefined :: (Memo Map) Integer Integer) fibF fib' :: Int -> Integer fib' = memo (undefined :: (Memo Map) Int Integer) fibF main :: IO () main = undefined