{-# LANGUAGE MultiParamTypeClasses,FlexibleInstances #-}
module Lift where
newtype MyNumbers a = MyNum a deriving Show
class Numbers a where
sqr :: a -> a
class Lifts b a where
lift0 :: a -> b a
lift1 :: (a -> a) -> b a -> b a
instance Lifts MyNumbers a where
lift0 x = MyNum x
lift1 o (MyNum x) = MyNum (o x)
instance Numbers Float where
sqr x = x * x
instance Numbers (MyNumbers Float) where
sqr x = lift1 sqr x