-- axiom: runFun unit x == C x N

lbind = A $ \xs -> A $ \f ->
    case xs of
      N        -> N       -- axiom: runFun (runFun bind N) f == N
      (C x xs) ->         -- axiom: runFun (runFun bind (C x xs)) f
                          --        == runFun f x `append` runFun (runFun bind xs) f
        runFun f x `append` runFun (runFun lbind xs) f

--   bind N f        = N
--   bind (C x xs) f = f x `append` bind xs f
lbind = A $ \xs -> A $ \f ->
    case xs of
      N        -> N       -- axiom: runFun (runFun bind N) f == N
      (C x xs) ->         -- axiom: runFun (runFun bind (C x xs)) f
                          --        == runFun f x `append` runFun (runFun bind xs) f
        runFun f x `append` runFun (runFun lbind xs) f

--   bind N f        = N
--   bind (C x xs) f = f x `append` bind xs f
lbind = A $ \xs -> A $ \f ->
    case xs of
      N        -> N       -- axiom: runFun (runFun bind N) f == N
      (C x xs) ->         -- axiom: runFun (runFun bind (C x xs)) f
                          --        == runFun f x `append` runFun (runFun bind xs) f
        runFun f x `append` runFun (runFun lbind xs) f

--   bind N f        = N
--   bind (C x xs) f = f x `append` bind xs f