{-@ data Arrow a b <p :: a -> b -> Prop> = A {runFun ::  x:a -> b<p x>} @-}


-- | Express Left Identity

{-@ measure runFun :: (Arrow a b) -> a -> b @-}



-- use abstract refinements to do this:
-- unit and bind should have the appropriate properties to prove left Identity.
prop_left_identity_List :: a -> Arrow a (L b) -> Proof
prop_left_identity_List = prop_left_identity lunit lbind
prop_left_identity_List :: a -> Arrow a (L b) -> Proof
prop_left_identity_List = prop_left_identity lunit lbind
prop_left_identity_List = prop_left_identity lunit lbind