packages feed

liquidhaskell-0.8.10.7: typeclass-tests/Data/Functor.hs

{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple" @-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Functor where

import           Prelude                 hiding ( Functor(..)
                                                , Applicative(..)
                                                , Monad(..)
                                                , Foldable(..)
                                                , Maybe(..)
                                                , Monoid(..)
                                                , Semigroup(..)
                                                , Either(..)
                                                , id
                                                , flip
                                                , const
                                                , apply
                                                )
import           Liquid.ProofCombinators
import           Data.List
import Data.Function
import Data.Functor.Classes
-- TODO: Move these to a separate module. 



-- TODO: Define `Maybe a` in Data.Maybe



-- Kleisli Arrow



{-@ data Pair a b = Pair {projl :: a, projr :: b }  @-}
data Pair l r = Pair {projl :: l, projr :: r }
-- Writer Monad
instance Functor (Pair u) where
  fmap f (Pair u a) = (Pair u (f a))
  a <$ (Pair u _) = (Pair u a)

instance VFunctor (Pair u) where
  lawFunctorId (Pair _ _) = ()
  lawFunctorComposition _ _ _ = ()

-- instance Monoid u => Applicative (Pair u) where
--   pure x = Pair mempty x
--   ap (Pair u f) (Pair v x) = (Pair (u `mappend` v) (f x))
--   liftA2 f x y = pure f `ap` x `ap` y
--   a1 *> a2 = ap (id <$ a1) a2
--   a1 <* a2 = liftA2 const a1 a2

-- instance Monoid u => Monad (Pair u) where
--   bind (Pair u a) k = case k a of
--     (Pair v b) -> (Pair (mappend u v) b)
--   return = pure
--   mseq (Pair u _) (Pair v a) = (Pair (mappend u v) a)




-- instance (VMonoid u) => VApplicative (Pair u) where
--   lawApplicativeId _ = ()
--   lawApplicativeComposition (Pair _ _) (Pair _ _) (Pair _ _)  = ()
--   lawApplicativeHomomorphism f x (Pair _ _) = ()
--   lawApplicativeInterchange (Pair _ _) _ = ()



-- data Compose f g a = Compose {getCompose :: f (g a)}

-- instance (Functor f, Functor g) => Functor (Compose f g) where
--   fmap f (Compose x) = Compose $ fmap (fmap f) x
--   x <$ m = fmap (const x) m

-- instance (VFunctor f, VFunctor g) => VFunctor (Compose f g) where
-- --    {-@ lawFunctorId :: forall a . x:m a -> {fmap id x == id x} @-}
--   lawFunctorId (Compose x) =
--     (axiomExt (fmap id :: g a -> g a) id $ \x -> ()) `cast`
--     fmap id (Compose x) `cast`
--     fmap (fmap id) x `cast`
--     lawFunctorId x `cast`
--     ()
--   lawFunctorComposition f g (Compose x) =
--     fmap (fmap (compose f g)) x `cast`
--     ()

--    {-@ lawFunctorComposition :: forall a b c . f:(b -> c) -> g:(a -> b) -> x:m a -> { fmap (compose f g) x == compose (fmap f) (fmap g) x } @-}
--    lawFunctorComposition :: forall a b c. (b -> c) -> (a -> b) -> m a -> ()







-- Instantiation
-- {-@ optionCompose :: f:(a -> Optional b) -> g:(b -> Optional c) -> h:(c -> Optional d) -> x:a -> {kcompose (kcompose f g) h x == kcompose f (kcompose g h) x} @-}
-- optionCompose :: (a -> Optional b) -> (b -> Optional c) -> (c -> Optional d) -> a -> ()
-- optionCompose  = kcomposeAssoc 


-- -- TODO: Prove this
-- {-@ applicativeLemma1 :: VApplicative m => f:(a -> b) -> x:m a -> {fmap f x == ap (pure f) x} @-}
-- applicativeLemma1 :: VApplicative m => (a -> b) -> m a -> ()
-- applicativeLemma1 f x = ()

-- -- TODO: Prove this
-- {-@ applicativeLemma2 :: VApplicative m => f:(d -> c -> e) -> g:(a -> b -> c) -> p:_ -> {q:_ | p (q x y) = compose (f x) (g y)} -> {liftA2 p (liftA2 q u v) = compose (liftA2 f u) (liftA2 g v)} @-}
-- applicativeLemma2 :: VApplicative m => (d -> c -> e) -> (a -> b -> c) -> _ -> _ -> ()
-- applicativeLemma2 f g p q = undefined