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)))).

(* Specifications: *)
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)))).