
Hello, While reading the list of changes in GHC 7.2 I noticed that default signatures extention have been added. Therefore following code compiles:
{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE DefaultSignatures #-} class Functor f where fmap :: (a -> b) -> f a -> f b default fmap :: Applicative f => (a -> b) -> f a -> f b f `fmap` m = pure f <*> m (<$) :: a -> f b -> f a (<$) = fmap . const
(<$>) = fmap
class Functor f => Pointed f where point :: a -> f a default point :: Applicative f => a -> f a point = pure
class Pointed f => Applicative f where pure :: a -> f a default pure :: Monad f => a -> f a pure = return (<*>) :: f (a -> b) -> f a -> f b default (<*>) :: Monad f => f (a -> b) -> f a -> f b f <*> v = liftM2 ($) f v (*>) :: f a -> f b -> f b (*>) = liftA2 (const id) (<*) :: f a -> f b -> f a (<*) = liftA2 const
class Applicative f => Monad f where return :: a -> f a (>>=) :: f a -> (a -> f b) -> f b (>>) :: f a -> f b -> f b m >> k = m >>= const k
data List a = Empty | Cons a (List a)
instance Monad List where return x = Cons x Empty Empty >>= _ = Empty Cons x xs >>= f = Cons (f x) (xs >>= f)
test = Empty <*> Empty
($) = \f v -> f v liftA2 f a b = f <$> a <*> b liftM2 f a b = f >>= \f' -> a >>= \a' -> b >>= \b'-> return (f' a' b') const a _ = a fix f = let x = f x in x error _ = fix id id x = x f . g = \x -> f (g x)
While the Functor f => (Pointed f =>) Applicative f => Monad f is still discussed the default methods would be a step towards the goal. Regards