diff -r d30f4a509361 -r 23ce0d32de11 src/HOL/Library/State_Monad.thy --- a/src/HOL/Library/State_Monad.thy Wed Mar 12 08:47:35 2008 +0100 +++ b/src/HOL/Library/State_Monad.thy Wed Mar 12 08:47:36 2008 +0100 @@ -115,8 +115,8 @@ \begin{itemize} \item The monad model does not state anything about the kind of state; the model for the state is - completely orthogonal and has to (or may) be - specified completely independent. + completely orthogonal and may be + specified completely independently. \item There is no distinguished type constructor encapsulating away the state transformation, i.e.~transformations may be applied directly without using any lifting @@ -191,6 +191,26 @@ lemmas monad_collapse = monad_simp o_apply o_assoc split_Pair split_comp mbind_def fcomp_def run_def +subsection {* ML abstract operations *} + +ML {* +structure StateMonad = +struct + +fun liftT T sT = sT --> HOLogic.mk_prodT (T, sT); +fun liftT' sT = sT --> sT; + +fun return T sT x = Const (@{const_name return}, T --> liftT T sT) $ x; + +fun mbind T1 T2 sT f g = Const (@{const_name mbind}, + liftT T1 sT --> (T1 --> liftT T2 sT) --> liftT T2 sT) $ f $ g; + +fun run T sT f = Const (@{const_name run}, liftT' (liftT T sT)) $ f; + +end; +*} + + subsection {* Syntax *} text {* @@ -270,8 +290,7 @@ | "list_yield f (x#xs) = (do y \ f x; ys \ list_yield f xs; return (y#ys) done)" definition - collapse :: "('a \ ('a \ 'b \ 'a) \ 'a) \ 'a \ 'b \ 'a" - where + collapse :: "('a \ ('a \ 'b \ 'a) \ 'a) \ 'a \ 'b \ 'a" where "collapse f = (do g \ f; g done)" text {* combinator properties *}