224 "_let x t f" => "CONST Let t (\<lambda>x. f)" |
224 "_let x t f" => "CONST Let t (\<lambda>x. f)" |
225 "_nil f" => "f" |
225 "_nil f" => "f" |
226 |
226 |
227 print_translation {* |
227 print_translation {* |
228 let |
228 let |
229 fun unfold_monad (Const (@{const_syntax mbind}, _) $ f $ Abs (abs as (_, ty, _))) = |
229 fun dest_abs_eta (Abs (abs as (_, ty, _))) = |
230 let |
230 let |
231 val (v', g') = Syntax.variant_abs abs; |
231 val (v, t) = Syntax.variant_abs abs; |
232 in Const ("_mbind", dummyT) $ Free (v', ty) $ f $ unfold_monad g' end |
232 in ((v, ty), t) end |
|
233 | dest_abs_eta t = |
|
234 let |
|
235 val (v, t) = Syntax.variant_abs ("", dummyT, t $ Bound 0); |
|
236 in ((v, dummyT), t) end |
|
237 fun unfold_monad (Const (@{const_syntax mbind}, _) $ f $ g) = |
|
238 let |
|
239 val ((v, ty), g') = dest_abs_eta g; |
|
240 in Const ("_mbind", dummyT) $ Free (v, ty) $ f $ unfold_monad g' end |
233 | unfold_monad (Const (@{const_syntax fcomp}, _) $ f $ g) = |
241 | unfold_monad (Const (@{const_syntax fcomp}, _) $ f $ g) = |
234 Const ("_fcomp", dummyT) $ f $ unfold_monad g |
242 Const ("_fcomp", dummyT) $ f $ unfold_monad g |
235 | unfold_monad (Const (@{const_syntax Let}, _) $ f $ Abs (abs as (_, ty, _))) = |
243 | unfold_monad (Const (@{const_syntax Let}, _) $ f $ g) = |
236 let |
244 let |
237 val (v', g') = Syntax.variant_abs abs; |
245 val ((v, ty), g') = dest_abs_eta g; |
238 in Const ("_mbind", dummyT) $ Free (v', ty) $ f $ unfold_monad g' end |
246 in Const ("_let", dummyT) $ Free (v, ty) $ f $ unfold_monad g' end |
239 | unfold_monad (Const (@{const_syntax Pair}, _) $ f) = |
247 | unfold_monad (Const (@{const_syntax Pair}, _) $ f) = |
240 Const ("return", dummyT) $ f |
248 Const ("return", dummyT) $ f |
241 | unfold_monad f = f; |
249 | unfold_monad f = f; |
242 fun tr' (f::ts) = |
250 fun tr' (f::ts) = |
243 list_comb (Const ("_do", dummyT) $ unfold_monad f, ts) |
251 list_comb (Const ("_do", dummyT) $ unfold_monad f, ts) |