Definition sequence {A B} (df : ByteListReader.t (A -> B))
           (da : ByteListReader.t A) : ByteListReader.t B :=
  ByteListReader.bind df
                      (fun f =>
                         (ByteListReader.bind da
                                              (fun a => ByteListReader.ret (f a)))).

Lemma sequence_rewrite : forall {A B : Type} (df : ByteListReader.t (A -> B)) (da : ByteListReader.t A), sequence df da = ByteListReader.bind df (fun f => (ByteListReader.bind da (fun a => ByteListReader.ret (f a)))).