theory Primitives imports Main "HOL-Library.Monad_Syntax" begin datatype u32 = u32 nat datatype 'a result = Ok 'a | Err fun u32_lt :: "u32 \ u32 \ bool" where "u32_lt (u32 a) (u32 b) = (a < b)" definition bind :: "'a result \ ('a \ 'b result) \ 'b result" where "bind m f \ (case m of Err \ Err | Ok a \ f a)" adhoc_overloading Monad_Syntax.bind bind declare bind_def[simp] end