abides-0.0.0: src/Test/Abides/Control/Applicative.hs
{-# LANGUAGE
RankNTypes
, ScopedTypeVariables
#-}
module Test.Abides.Control.Applicative where
identity :: Applicative f => Eq (f a) => f a -> Bool
identity x = (pure id <*> x) == x
composition :: Applicative f => Eq (f c) => f (b -> c) -> f (a -> b) -> f a -> Bool
composition f g h = (pure (.) <*> f <*> g <*> h) == (f <*> (g <*> h))
-- FIXME ambiguous type?
-- homomorphism :: forall f a b. Applicative f => Eq (f b) => (a -> b) -> a -> Bool
-- homomorphism f x = (f' <*> x') == y'
-- where
-- f' :: f (a -> b)
-- f' = pure f
-- x' :: f a
-- x' = pure x
-- y' :: f b
-- y' = pure (f x)